Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[SR-7989] Use of Self Outside of Protocol Context with Conditional Conformance Causes Crash #50522

Closed
CodaFi opened this issue Jun 13, 2018 · 9 comments
Assignees
Labels
bug A deviation from expected or documented behavior. Also: expected but undesirable behavior. compiler The Swift compiler in itself crash Bug: A crash, i.e., an abnormal termination of software

Comments

@CodaFi
Copy link
Member

CodaFi commented Jun 13, 2018

Previous ID SR-7989
Radar rdar://problem/41126254
Original Reporter @CodaFi
Type Bug
Status Closed
Resolution Done
Additional Detail from JIRA
Votes 0
Component/s Compiler
Labels Bug, CompilerCrash
Assignee @huonw
Priority Medium

md5: e30ae091516ded8cbac4233fc190f2e5

Issue Description:

This code crashes the Swift compiler on master. A generic signature is not created for the last invalid extension. This trips an assertion when the GSB tries to retrieve bogus conditional requirements.

protocol P1 {}
protocol P2 {}

struct Var<N> {}

extension Var : P2 where N : P1 { }

protocol P3 {}
extension Var : P3 where Self : P2 {}
@belkadan
Copy link
Contributor

cc @huonw

@belkadan
Copy link
Contributor

@swift-ci create

@AnthonyLatsis
Copy link
Collaborator

Not the `Self` fault, it's it being substituted with the extended type that plays the main role.

@AnthonyLatsis
Copy link
Collaborator

#17284

@huonw
Copy link
Mannequin

huonw mannequin commented Jun 19, 2018

The crash is

sr-7989.swift:9:26: error: 'Self' is only available in a protocol or as the result of a method in a class; did you mean 'Var'?
extension Var : P3 where Self : P2 {}
                         ^~~~
                         Var
Assertion failed: ((bool)typeSig == (bool)extensionSig && "unexpected generic-ness mismatch on conformance"), function differenceAndStoreConditionalRequirements, file /Users/huon/projects/swift/swift/lib/AST/ProtocolConformance.cpp, line 400.
0  swift                    0x000000010e3738d8 llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 40
1  swift                    0x000000010e373fe6 SignalHandler(int) + 694
2  libsystem_platform.dylib 0x00007fff5c244f5a _sigtramp + 26
3  libsystem_platform.dylib 000000000000000000 _sigtramp + 2749083840
4  libsystem_c.dylib        0x00007fff5bfe21ae abort + 127
5  libsystem_c.dylib        0x00007fff5bfaa1ac basename_r + 0
6  swift                    0x000000010bdfa4ba swift::NormalProtocolConformance::differenceAndStoreConditionalRequirements() + 602
7  swift                    0x000000010bcaff75 swift::ASTContext::getConformance(swift::Type, swift::ProtocolDecl*, swift::SourceLoc, swift::DeclContext*, swift::ProtocolConformanceState) + 213
8  swift                    0x000000010bd4a945 swift::ConformanceLookupTable::getConformance(swift::NominalTypeDecl*, swift::ConformanceLookupTable::ConformanceEntry*) + 581
9  swift                    0x000000010bd4aeef swift::ConformanceLookupTable::lookupConformance(swift::ModuleDecl*, swift::NominalTypeDecl*, swift::ProtocolDecl*, swift::LazyResolver*, llvm::SmallVectorImpl<swift::ProtocolConformance*>&) + 463
10 swift                    0x000000010bdd76d8 swift::ModuleDecl::lookupConformance(swift::Type, swift::ProtocolDecl*) + 1128
11 swift                    0x000000010bda0653 swift::GenericSignatureBuilder::lookupConformance(swift::CanType, swift::Type, swift::ProtocolDecl*) + 291
12 swift                    0x000000010bdabb89 swift::GenericSignatureBuilder::addTypeRequirement(llvm::PointerUnion<swift::GenericSignatureBuilder::PotentialArchetype*, swift::Type>, llvm::PointerUnion<swift::GenericSignatureBuilder::PotentialArchetype*, swift::Type>, swift::GenericSignatureBuilder::FloatingRequirementSource, swift::GenericSignatureBuilder::UnresolvedHandlingKind, swift::ModuleDecl*) + 2265
13 swift                    0x000000010bda8fcf swift::GenericSignatureBuilder::addRequirement(swift::RequirementRepr const*, swift::GenericSignatureBuilder::FloatingRequirementSource, swift::SubstitutionMap const*, swift::ModuleDecl*) + 2159
14 swift                    0x000000010bdaf9ee swift::GenericSignatureBuilder::addRequirement(swift::RequirementRepr const*, swift::ModuleDecl*) + 78
15 swift                    0x000000010ba65d45 swift::TypeChecker::checkGenericParamList(swift::GenericSignatureBuilder*, swift::GenericParamList*, swift::GenericSignature*, swift::GenericTypeResolver*) + 389
16 swift                    0x000000010ba6ad5d swift::TypeChecker::checkGenericEnvironment(swift::GenericParamList*, swift::DeclContext*, swift::GenericSignature*, bool, swift::ExtensionDecl*, llvm::function_ref<void (swift::GenericSignatureBuilder&)>, bool) + 1133
17 swift                    0x000000010ba32d3c swift::TypeChecker::validateExtension(swift::ExtensionDecl*) + 492
18 swift                    0x000000010b9d66ae swift::IterativeTypeChecker::processResolveInheritedClauseEntry(std::__1::pair<llvm::PointerUnion<swift::TypeDecl*, swift::ExtensionDecl*>, unsigned int>, llvm::function_ref<bool (swift::TypeCheckRequest)>) + 126
19 swift                    0x000000010b9d8532 swift::IterativeTypeChecker::satisfy(swift::TypeCheckRequest) + 498
20 swift                    0x000000010ba30de7 swift::TypeChecker::resolveInheritanceClause(llvm::PointerUnion<swift::TypeDecl*, swift::ExtensionDecl*>) + 151
21 swift                    0x000000010bd49755 swift::ConformanceLookupTable::expandImpliedConformances(swift::NominalTypeDecl*, swift::DeclContext*, swift::LazyResolver*) + 341
22 swift                    0x000000010bd47b88 swift::ConformanceLookupTable::updateLookupTable(swift::NominalTypeDecl*, swift::ConformanceLookupTable::ConformanceStage, swift::LazyResolver*) + 2024
23 swift                    0x000000010bd4b5d1 swift::ConformanceLookupTable::getAllProtocols(swift::NominalTypeDecl*, swift::LazyResolver*, llvm::SmallVectorImpl<swift::ProtocolDecl*>&) + 33
24 swift                    0x000000010bdfcbdd swift::NominalTypeDecl::getAllProtocols() const + 109
25 swift                    0x000000010bdebbb5 swift::DeclContext::lookupQualified(swift::Type, swift::DeclName, swift::NLOptions, swift::LazyResolver*, llvm::SmallVectorImpl<swift::ValueDecl*>&) const + 853
26 swift                    0x000000010bac9a5b resolveTopLevelIdentTypeComponent(swift::TypeChecker&, swift::DeclContext*, swift::ComponentIdentTypeRepr*, swift::OptionSet<swift::TypeResolutionFlags, unsigned int>, bool, swift::GenericTypeResolver*, llvm::function_ref<bool (swift::TypeCheckRequest)>*) + 811
27 swift                    0x000000010bac4626 resolveIdentTypeComponent(swift::TypeChecker&, swift::DeclContext*, llvm::ArrayRef<swift::ComponentIdentTypeRepr*>, swift::OptionSet<swift::TypeResolutionFlags, unsigned int>, bool, swift::GenericTypeResolver*, llvm::function_ref<bool (swift::TypeCheckRequest)>*) + 566
28 swift                    0x000000010bac4037 swift::TypeChecker::resolveIdentifierType(swift::DeclContext*, swift::IdentTypeRepr*, swift::OptionSet<swift::TypeResolutionFlags, unsigned int>, bool, swift::GenericTypeResolver*, llvm::function_ref<bool (swift::TypeCheckRequest)>*) + 151
29 swift                    0x000000010bac4cde (anonymous namespace)::TypeResolver::resolveType(swift::TypeRepr*, swift::OptionSet<swift::TypeResolutionFlags, unsigned int>) + 158
30 swift                    0x000000010bac4c0d swift::TypeChecker::resolveType(swift::TypeRepr*, swift::DeclContext*, swift::OptionSet<swift::TypeResolutionFlags, unsigned int>, swift::GenericTypeResolver*, llvm::function_ref<bool (swift::TypeCheckRequest)>*) + 173
31 swift                    0x000000010bac376a swift::TypeChecker::validateType(swift::TypeLoc&, swift::DeclContext*, swift::OptionSet<swift::TypeResolutionFlags, unsigned int>, swift::GenericTypeResolver*, llvm::function_ref<bool (swift::TypeCheckRequest)>*) + 202
32 swift                    0x000000010ba65f5e swift::TypeChecker::validateRequirement(swift::SourceLoc, swift::RequirementRepr&, swift::DeclContext*, swift::OptionSet<swift::TypeResolutionFlags, unsigned int>, swift::GenericTypeResolver*) + 222
33 swift                    0x000000010ba65d26 swift::TypeChecker::checkGenericParamList(swift::GenericSignatureBuilder*, swift::GenericParamList*, swift::GenericSignature*, swift::GenericTypeResolver*) + 358
34 swift                    0x000000010ba6ad5d swift::TypeChecker::checkGenericEnvironment(swift::GenericParamList*, swift::DeclContext*, swift::GenericSignature*, bool, swift::ExtensionDecl*, llvm::function_ref<void (swift::GenericSignatureBuilder&)>, bool) + 1133
35 swift                    0x000000010ba32d3c swift::TypeChecker::validateExtension(swift::ExtensionDecl*) + 492
36 swift                    0x000000010ba4f8e0 (anonymous namespace)::DeclChecker::visitExtensionDecl(swift::ExtensionDecl*) + 32
37 swift                    0x000000010ba387dc (anonymous namespace)::DeclChecker::visit(swift::Decl*) + 236
38 swift                    0x000000010ba386e6 swift::TypeChecker::typeCheckDecl(swift::Decl*) + 38
39 swift                    0x000000010bad4628 swift::performTypeChecking(swift::SourceFile&, swift::TopLevelContext&, swift::OptionSet<swift::TypeCheckingFlags, unsigned int>, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int) + 1720
40 swift                    0x000000010b70af4c swift::CompilerInstance::parseAndTypeCheckMainFile(swift::PersistentParserState&, swift::DelayedParsingCallbacks*, swift::OptionSet<swift::TypeCheckingFlags, unsigned int>) + 444
41 swift                    0x000000010b709b2c swift::CompilerInstance::parseAndCheckTypes(swift::CompilerInstance::ImplicitImports const&) + 636
42 swift                    0x000000010b709458 swift::CompilerInstance::performSema() + 472
43 swift                    0x000000010ab6e352 performCompile(swift::CompilerInstance&, swift::CompilerInvocation&, llvm::ArrayRef<char const*>, int&, swift::FrontendObserver*, swift::UnifiedStatsReporter*) + 1410
44 swift                    0x000000010ab6cd5a swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 2954
45 swift                    0x000000010ab27f5d main + 2317
46 libdyld.dylib            0x00007fff5bf36015 start + 1
Stack dump:
0.  Program arguments: /Users/huon/projects/swift/build/Ninja-RelWithDebInfoAssert/swift-macosx-x86_64/bin/swift -frontend -c -primary-file sr-7989.swift -target x86_64-apple-darwin17.6.0 -enable-objc-interop -module-name main -o /var/folders/3k/4q7m7bkn2k750rpr0jm8s9fr0000gn/T/sr-7989-33dce4.o 
1.  While type-checking extension of Var at sr-7989.swift:6:1
2.  While resolving type P1 at [sr-7989.swift:6:30 - line:6:30] RangeText="P"
<unknown>:0: error: unable to execute command: Abort trap: 6
<unknown>:0: error: compile command failed due to signal 6 (use -v to see invocation)

I'm pretty sure this is essentially a dupe of https://bugs.swift.org/browse/SR-6569, manifesting slightly differently since this is crashing on invalid code.

@AnthonyLatsis
Copy link
Collaborator

https://bugs.swift.org/browse/SR-8033 has the same assertion tripped.

@huonw
Copy link
Mannequin

huonw mannequin commented Jun 21, 2018

#17356

@AnnaZaks
Copy link
Mannequin

AnnaZaks mannequin commented Jul 26, 2018

@CodaFi, Could you verify if the problem is fixed and if so move the JIRA to "Closed"?
Thanks!
Anna

@CodaFi
Copy link
Member Author

CodaFi commented Jul 28, 2018

Confirmed

@swift-ci swift-ci transferred this issue from apple/swift-issues Apr 25, 2022
@AnthonyLatsis AnthonyLatsis added the crash Bug: A crash, i.e., an abnormal termination of software label Dec 12, 2022
This issue was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug A deviation from expected or documented behavior. Also: expected but undesirable behavior. compiler The Swift compiler in itself crash Bug: A crash, i.e., an abnormal termination of software
Projects
None yet
Development

No branches or pull requests

3 participants