Skip to content

Compiler crash when using Self in associatedtype declaration and inference type in Swift 6 #75371

@b1ackturtle

Description

@b1ackturtle

Description

When attempting to compile the following code in Swift 6, the compiler crashes.

Reproduction

protocol MyProtocol {
    associatedtype Value = Self

    static var originalValue: Value { get }
    static var copyValue: Value { get }
}

struct MyStruct: MyProtocol {}

extension MyStruct {
    static let originalValue = Self()
    static let copyValue = originalValue
}

Stack dump

Stack dump:
0.	Program arguments: /Applications/Xcode-16.0.0-Beta.3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-frontend -frontend -interpret sample.swift -Xllvm -aarch64-use-tbi -enable-objc-interop -stack-check -sdk /Applications/Xcode-16.0.0-Beta.3.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.0.sdk -color-diagnostics -new-driver-path /Applications/Xcode-16.0.0-Beta.3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-driver -empty-abi-descriptor -resource-dir /Applications/Xcode-16.0.0-Beta.3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift -module-name sample -disable-clang-spi -target-sdk-version 15.0 -target-sdk-name macosx15.0 -external-plugin-path /Applications/Xcode-16.0.0-Beta.3.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/lib/swift/host/plugins#/Applications/Xcode-16.0.0-Beta.3.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/bin/swift-plugin-server -external-plugin-path /Applications/Xcode-16.0.0-Beta.3.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/local/lib/swift/host/plugins#/Applications/Xcode-16.0.0-Beta.3.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/bin/swift-plugin-server -plugin-path /Applications/Xcode-16.0.0-Beta.3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/host/plugins -plugin-path /Applications/Xcode-16.0.0-Beta.3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/lib/swift/host/plugins
1.	Apple Swift version 6.0 (swiftlang-6.0.0.5.15 clang-1600.0.22.6)
2.	Compiling with effective version 5.10
3.	While evaluating request TypeCheckSourceFileRequest(source_file "sample.swift")
4.	While type-checking 'MyStruct' (at sample.swift:8:1)
5.	While type-checking protocol conformance MyStruct: MyProtocol at 'MyStruct' (at sample.swift:8:1)
6.	While evaluating request ResolveTypeWitnessesRequest(MyStruct: MyProtocol module sample)
7.	While evaluating request InterfaceTypeRequest(sample.(file).MyStruct [email protected]:12:16)
8.	While evaluating request NamingPatternRequest(sample.(file).MyStruct [email protected]:12:16)
9.	While evaluating request PatternBindingEntryRequest((unknown decl), 0)
10.	While type-checking expression at [sample.swift:12:28 - line:12:28] RangeText=""
11.	While type-checking-target starting at sample.swift:12:28
12.	While evaluating request ValueWitnessRequest(MyStruct: MyProtocol module sample, sample.(file)[email protected]:4:16)
Stack dump without symbol names (ensure you have llvm-symbolizer in your PATH or set the environment var `LLVM_SYMBOLIZER_PATH` to point to it):
0  swift-frontend           0x0000000106331da8 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) + 56
1  swift-frontend           0x000000010632fffc llvm::sys::RunSignalHandlers() + 112
2  swift-frontend           0x0000000106332374 SignalHandler(int) + 292
3  libsystem_platform.dylib 0x000000019916b584 _sigtramp + 56
4  swift-frontend           0x00000001021228a0 swift::ConformanceChecker::resolveSingleWitness(swift::ValueDecl*) + 296
5  swift-frontend           0x00000001021302cc swift::ValueWitnessRequest::evaluate(swift::Evaluator&, swift::NormalProtocolConformance*, swift::ValueDecl*) const + 156
6  swift-frontend           0x000000010267ca7c swift::ValueWitnessRequest::OutputType swift::Evaluator::getResultUncached<swift::ValueWitnessRequest, swift::ValueWitnessRequest::OutputType swift::evaluateOrDefault<swift::ValueWitnessRequest>(swift::Evaluator&, swift::ValueWitnessRequest, swift::ValueWitnessRequest::OutputType)::'lambda'()>(swift::ValueWitnessRequest const&, swift::ValueWitnessRequest::OutputType swift::evaluateOrDefault<swift::ValueWitnessRequest>(swift::Evaluator&, swift::ValueWitnessRequest, swift::ValueWitnessRequest::OutputType)::'lambda'()) + 624
7  swift-frontend           0x0000000102672ddc swift::NormalProtocolConformance::getWitness(swift::ValueDecl*) const + 376
8  swift-frontend           0x0000000102672c2c swift::ProtocolConformance::getWitnessDecl(swift::ValueDecl*) const + 128
9  swift-frontend           0x0000000102108448 (anonymous namespace)::LookupResultBuilder::add(swift::ValueDecl*, swift::DeclContext*, swift::ValueDecl*, swift::Type, bool) + 820
10 swift-frontend           0x0000000102107f88 swift::TypeChecker::lookupUnqualified(swift::DeclContext*, swift::DeclNameRef, swift::SourceLoc, swift::optionset::OptionSet<swift::NameLookupFlags, unsigned int>) + 620
11 swift-frontend           0x0000000101fc0f10 swift::TypeChecker::resolveDeclRefExpr(swift::UnresolvedDeclRefExpr*, swift::DeclContext*, bool) + 1432
12 swift-frontend           0x0000000101fc51fc (anonymous namespace)::PreCheckExpression::walkToExprPre(swift::Expr*) + 1036
13 swift-frontend           0x0000000101fc49cc swift::constraints::ConstraintSystem::preCheckExpression(swift::Expr*&, swift::DeclContext*, bool) + 388
14 swift-frontend           0x0000000101fc4798 swift::constraints::ConstraintSystem::preCheckTarget(swift::constraints::SyntacticElementTarget&, bool) + 92
15 swift-frontend           0x0000000102060d40 swift::TypeChecker::typeCheckTarget(swift::constraints::SyntacticElementTarget&, swift::optionset::OptionSet<swift::TypeCheckExprFlags, unsigned int>) + 336
16 swift-frontend           0x0000000102060acc swift::TypeChecker::typeCheckExpression(swift::constraints::SyntacticElementTarget&, swift::optionset::OptionSet<swift::TypeCheckExprFlags, unsigned int>) + 416
17 swift-frontend           0x0000000102062104 swift::TypeChecker::typeCheckBinding(swift::Pattern*&, swift::Expr*&, swift::DeclContext*, swift::Type, swift::PatternBindingDecl*, unsigned int, swift::optionset::OptionSet<swift::TypeCheckExprFlags, unsigned int>) + 172
18 swift-frontend           0x0000000102062394 swift::TypeChecker::typeCheckPatternBinding(swift::PatternBindingDecl*, unsigned int, swift::Type, swift::optionset::OptionSet<swift::TypeCheckExprFlags, unsigned int>) + 356
19 swift-frontend           0x00000001021586a8 swift::PatternBindingEntryRequest::evaluate(swift::Evaluator&, swift::PatternBindingDecl*, unsigned int) const + 3192
20 swift-frontend           0x00000001024e1960 swift::PatternBindingEntryRequest::OutputType swift::Evaluator::getResultUncached<swift::PatternBindingEntryRequest, swift::PatternBindingEntryRequest::OutputType swift::evaluateOrDefault<swift::PatternBindingEntryRequest>(swift::Evaluator&, swift::PatternBindingEntryRequest, swift::PatternBindingEntryRequest::OutputType)::'lambda'()>(swift::PatternBindingEntryRequest const&, swift::PatternBindingEntryRequest::OutputType swift::evaluateOrDefault<swift::PatternBindingEntryRequest>(swift::Evaluator&, swift::PatternBindingEntryRequest, swift::PatternBindingEntryRequest::OutputType)::'lambda'()) + 624
21 swift-frontend           0x00000001024a5288 swift::PatternBindingDecl::getCheckedPatternBindingEntry(unsigned int) const + 144
22 swift-frontend           0x0000000102078e5c swift::NamingPatternRequest::evaluate(swift::Evaluator&, swift::VarDecl*) const + 312
23 swift-frontend           0x000000010253f99c swift::NamingPatternRequest::OutputType swift::Evaluator::getResultUncached<swift::NamingPatternRequest, swift::NamingPatternRequest::OutputType swift::evaluateOrDefault<swift::NamingPatternRequest>(swift::Evaluator&, swift::NamingPatternRequest, swift::NamingPatternRequest::OutputType)::'lambda'()>(swift::NamingPatternRequest const&, swift::NamingPatternRequest::OutputType swift::evaluateOrDefault<swift::NamingPatternRequest>(swift::Evaluator&, swift::NamingPatternRequest, swift::NamingPatternRequest::OutputType)::'lambda'()) + 624
24 swift-frontend           0x0000000102077da4 swift::InterfaceTypeRequest::evaluate(swift::Evaluator&, swift::ValueDecl*) const + 2328
25 swift-frontend           0x000000010249d188 swift::ValueDecl::getInterfaceType() const + 1120
26 swift-frontend           0x000000010249ccf4 swift::Decl::isInvalid() const + 136
27 swift-frontend           0x0000000101d7c548 getWitnessTypeForMatching(swift::NormalProtocolConformance*, swift::ValueDecl*) + 48
28 swift-frontend           0x0000000101d79968 (anonymous namespace)::AssociatedTypeInference::inferTypeWitnessesViaValueWitnesses(llvm::SetVector<swift::AssociatedTypeDecl*, std::__1::vector<swift::AssociatedTypeDecl*, std::__1::allocator<swift::AssociatedTypeDecl*>>, llvm::DenseSet<swift::AssociatedTypeDecl*, llvm::DenseMapInfo<swift::AssociatedTypeDecl*, void>>, 0u> const&) + 3872
29 swift-frontend           0x0000000101d74b84 (anonymous namespace)::AssociatedTypeInference::solve() + 776
30 swift-frontend           0x0000000101d74680 swift::ResolveTypeWitnessesRequest::evaluate(swift::Evaluator&, swift::NormalProtocolConformance*) const + 216
31 swift-frontend           0x0000000101d90ebc swift::ResolveTypeWitnessesRequest::OutputType swift::Evaluator::getResultUncached<swift::ResolveTypeWitnessesRequest, swift::ResolveTypeWitnessesRequest::OutputType swift::evaluateOrDefault<swift::ResolveTypeWitnessesRequest>(swift::Evaluator&, swift::ResolveTypeWitnessesRequest, swift::ResolveTypeWitnessesRequest::OutputType)::'lambda'()>(swift::ResolveTypeWitnessesRequest const&, swift::ResolveTypeWitnessesRequest::OutputType swift::evaluateOrDefault<swift::ResolveTypeWitnessesRequest>(swift::Evaluator&, swift::ResolveTypeWitnessesRequest, swift::ResolveTypeWitnessesRequest::OutputType)::'lambda'()) + 608
32 swift-frontend           0x0000000101d90bd8 swift::ResolveTypeWitnessesRequest::OutputType swift::Evaluator::getResultCached<swift::ResolveTypeWitnessesRequest, swift::ResolveTypeWitnessesRequest::OutputType swift::evaluateOrDefault<swift::ResolveTypeWitnessesRequest>(swift::Evaluator&, swift::ResolveTypeWitnessesRequest, swift::ResolveTypeWitnessesRequest::OutputType)::'lambda'(), (void*)0>(swift::ResolveTypeWitnessesRequest const&, swift::ResolveTypeWitnessesRequest::OutputType swift::evaluateOrDefault<swift::ResolveTypeWitnessesRequest>(swift::Evaluator&, swift::ResolveTypeWitnessesRequest, swift::ResolveTypeWitnessesRequest::OutputType)::'lambda'()) + 328
33 swift-frontend           0x000000010212c7d8 (anonymous namespace)::MultiConformanceChecker::checkAllConformances() + 7388
34 swift-frontend           0x000000010212821c swift::TypeChecker::checkConformancesInContext(swift::IterableDeclContext*) + 6772
35 swift-frontend           0x00000001020b5404 (anonymous namespace)::DeclChecker::visit(swift::Decl*) + 3672
36 swift-frontend           0x00000001020b459c swift::TypeChecker::typeCheckDecl(swift::Decl*) + 152
37 swift-frontend           0x0000000102198ec0 swift::TypeCheckSourceFileRequest::evaluate(swift::Evaluator&, swift::SourceFile*) const + 660
38 swift-frontend           0x00000001021a0550 swift::TypeCheckSourceFileRequest::OutputType swift::Evaluator::getResultUncached<swift::TypeCheckSourceFileRequest, swift::TypeCheckSourceFileRequest::OutputType swift::evaluateOrDefault<swift::TypeCheckSourceFileRequest>(swift::Evaluator&, swift::TypeCheckSourceFileRequest, swift::TypeCheckSourceFileRequest::OutputType)::'lambda'()>(swift::TypeCheckSourceFileRequest const&, swift::TypeCheckSourceFileRequest::OutputType swift::evaluateOrDefault<swift::TypeCheckSourceFileRequest>(swift::Evaluator&, swift::TypeCheckSourceFileRequest, swift::TypeCheckSourceFileRequest::OutputType)::'lambda'()) + 620
39 swift-frontend           0x0000000102198c10 swift::performTypeChecking(swift::SourceFile&) + 328
40 swift-frontend           0x00000001010caaf0 swift::CompilerInstance::performSema() + 332
41 swift-frontend           0x0000000100d0c4bc withSemanticAnalysis(swift::CompilerInstance&, swift::FrontendObserver*, llvm::function_ref<bool (swift::CompilerInstance&)>, bool) + 40
42 swift-frontend           0x0000000100cfc728 performCompile(swift::CompilerInstance&, int&, swift::FrontendObserver*) + 2940
43 swift-frontend           0x0000000100cfa0e4 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 4280
44 swift-frontend           0x0000000100c80c84 swift::mainEntry(int, char const**) + 3680
45 dyld                     0x0000000198db20e0 start + 2360
zsh: segmentation fault  swift sample.swift

Expected behavior

The code should compile successfully without causing the compiler to crash.

Environment

swift-driver version: 1.111.2 Apple Swift version 6.0 (swiftlang-6.0.0.5.15 clang-1600.0.22.6)
Target: arm64-apple-macosx14.0

Additional information

The above code can be compiled with swift-DEVELOPMENT-SNAPSHOT-2024-01-22-a, but it crashes with swift-DEVELOPMENT-SNAPSHOT-2024-01-30-a and later.

It can be compiled with Swift 6 by providing a type hint as follows:

protocol MyProtocol {
    associatedtype Value = Self

    static var originalValue: Value { get }
    static var copyValue: Value { get }
}

struct MyStruct: MyProtocol {}

extension MyStruct {
    static let originalValue = Self()
    static let copyValue: Self = originalValue // Add a type hint
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    associated type inferenceassociatedtypeFeature → declarations → protocol: `associatedtype` declarationsbugA deviation from expected or documented behavior. Also: expected but undesirable behavior.compilerThe Swift compiler itselfconformancesFeature → protocol: protocol conformancescrashBug: A crash, i.e., an abnormal termination of softwareextensionFeature → declarations: `extension` declarationsswift 6.0type checkerArea → compiler: Semantic analysis

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions