Skip to content

swift 6.1/6.2 crash in RequirementMachine::verify #79763

Closed
@blindspotbounty

Description

@blindspotbounty

Description

New swift 6.1/6.2 crashes when compiling generics.
Similar to fixed one #79244 but still reproducing on main version from 28.02.2025

Reproduction

public protocol P: Equatable {
    associatedtype Object: Identifiable
}

public protocol Cache<Proto>: Sendable {
    associatedtype Proto: P

    subscript(_: Proto.Object.ID) -> Proto? { get }
}

struct ID1: Hashable {
    let rawValue: Int64
}

struct O: Identifiable {
    typealias ID = ID1
    var id: ID1 {
        .init(rawValue: .random(in: 0..<Int64.max))
    }
}

struct S: P {
    typealias Object = O
}

func foo(_ c: any Cache<S>) {
    c[ID1(rawValue: 0)]
}

Stack dump

Term verification failed
Initial term:    τ_0_0.[P:Object]
Erased term:     τ_0_0.Object
Simplified term: τ_0_0.Object

Requirement machine for <τ_0_0>
Rewrite system: {
}
Property map: {
}
Conformance paths: {
}
Stack dump:
0.	Program arguments: /Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2025-02-28-a.xctoolchain/usr/bin/swift-frontend -frontend -interpret main.swift -Xllvm -aarch64-use-tbi -enable-objc-interop -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -color-diagnostics -empty-abi-descriptor -resource-dir /Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2025-02-28-a.xctoolchain/usr/lib/swift -no-auto-bridging-header-chaining -module-name main -in-process-plugin-server-path /Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2025-02-28-a.xctoolchain/usr/lib/swift/host/libSwiftInProcPluginServer.dylib -plugin-path /Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2025-02-28-a.xctoolchain/usr/lib/swift/host/plugins -plugin-path /Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2025-02-28-a.xctoolchain/usr/local/lib/swift/host/plugins -target-sdk-version 15.2 -target-sdk-name macosx15.2 -external-plugin-path /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/lib/swift/host/plugins#/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/bin/swift-plugin-server -external-plugin-path /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/local/lib/swift/host/plugins#/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/bin/swift-plugin-server
1.	Apple Swift version 6.2-dev (LLVM 6e0f052df8282a3, Swift 659adcd481f01a1)
2.	Compiling with effective version 5.10
3.	While evaluating request TypeCheckPrimaryFileRequest(source_file "main.swift")
4.	While evaluating request TypeCheckFunctionBodyRequest(main.(file)[email protected]:26:6)
5.	While type-checking statement at [main.swift:26:29 - line:28:1] RangeText="{
    c[ID1(rawValue: 0)]
"
6.	While type-checking expression at [main.swift:27:5 - line:27:23] RangeText="c[ID1(rawValue: 0)"
7.	While type-checking-target starting at main.swift:27:6
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           0x000000010a8b3c40 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) + 56
1  swift-frontend           0x000000010a8b236c llvm::sys::RunSignalHandlers() + 112
2  swift-frontend           0x000000010a8b4288 SignalHandler(int, __siginfo*, void*) + 296
3  libsystem_platform.dylib 0x000000019e542de4 _sigtramp + 56
4  libsystem_pthread.dylib  0x000000019e50bf70 pthread_kill + 288
5  libsystem_c.dylib        0x000000019e418908 abort + 128
6  swift-frontend           0x000000010a9376b8 swift::rewriting::RequirementMachine::verify(swift::rewriting::MutableTerm const&) const (.cold.6) + 0
7  swift-frontend           0x0000000106909f24 swift::rewriting::RequirementMachine::verify(swift::rewriting::MutableTerm const&) const + 1060
8  swift-frontend           0x000000010690a278 swift::rewriting::RequirementMachine::requiresProtocol(swift::Type, swift::ProtocolDecl const*) const + 136
9  swift-frontend           0x0000000106974fb4 swift::SubstitutionMap::lookupConformance(swift::CanType, swift::ProtocolDecl*) const + 152
10 swift-frontend           0x00000001069a79f8 swift::LookUpConformanceInSubstitutionMap::operator()(swift::CanType, swift::Type, swift::ProtocolDecl*) const + 252
11 swift-frontend           0x00000001069766e8 swift::OuterSubstitutions::operator()(swift::CanType, swift::Type, swift::ProtocolDecl*) const + 100
12 swift-frontend           0x00000001069a8ba0 swift::InFlightSubstitution::lookupConformance(swift::CanType, swift::Type, swift::ProtocolDecl*, unsigned int) + 52
13 swift-frontend           0x00000001069ae678 (anonymous namespace)::TypeSubstituter::transformDependentMemberType(swift::DependentMemberType*, swift::TypePosition) + 272
14 swift-frontend           0x00000001069a9cb4 swift::TypeTransform<(anonymous namespace)::TypeSubstituter>::doIt(swift::Type, swift::TypePosition) + 2368
15 swift-frontend           0x00000001069a9098 swift::Type::subst(swift::InFlightSubstitution&) const + 748
16 swift-frontend           0x00000001069a8694 swift::Type::subst(llvm::function_ref<swift::Type (swift::SubstitutableType*)>, llvm::function_ref<swift::ProtocolConformanceRef (swift::CanType, swift::Type, swift::ProtocolDecl*)>, swift::SubstOptions) const + 420
17 swift-frontend           0x00000001062aa16c swift::Type llvm::function_ref<swift::Type (swift::Type, swift::TypePosition)>::callback_fn<swift::typeEraseOpenedExistentialReference(swift::Type, swift::Type, swift::TypeVariableType*, swift::TypePosition)::$_4>(long, swift::Type, swift::TypePosition) + 320
18 swift-frontend           0x00000001062a9e58 std::__1::optional<swift::Type> llvm::function_ref<std::__1::optional<swift::Type> (swift::TypeBase*, swift::TypePosition)>::callback_fn<typeEraseExistentialSelfReferences(swift::Type, swift::TypePosition, llvm::function_ref<bool (swift::Type)>, llvm::function_ref<bool (swift::Type)>, llvm::function_ref<swift::Type (swift::Type, swift::TypePosition)>)::$_0>(long, swift::TypeBase*, swift::TypePosition) + 652
19 swift-frontend           0x000000010698a040 swift::TypeTransform<swift::Type::transformWithPosition(swift::TypePosition, llvm::function_ref<std::__1::optional<swift::Type> (swift::TypeBase*, swift::TypePosition)>) const::Transform>::doIt(swift::Type, swift::TypePosition) + 80
20 swift-frontend           0x000000010698a258 swift::TypeTransform<swift::Type::transformWithPosition(swift::TypePosition, llvm::function_ref<std::__1::optional<swift::Type> (swift::TypeBase*, swift::TypePosition)>) const::Transform>::doIt(swift::Type, swift::TypePosition) + 616
21 swift-frontend           0x0000000106989fb0 swift::Type::transformWithPosition(swift::TypePosition, llvm::function_ref<std::__1::optional<swift::Type> (swift::TypeBase*, swift::TypePosition)>) const + 112
22 swift-frontend           0x00000001062a9788 swift::typeEraseOpenedExistentialReference(swift::Type, swift::Type, swift::TypeVariableType*, swift::TypePosition) + 288
23 swift-frontend           0x00000001062c677c swift::constraints::ConstraintSystem::getMemberReferenceTypeFromOpenedType(swift::Type&, swift::Type, swift::ValueDecl*, swift::DeclContext*, swift::constraints::ConstraintLocator*, bool, bool, llvm::ArrayRef<std::__1::pair<swift::GenericTypeParamType*, swift::TypeVariableType*>>) + 768
24 swift-frontend           0x00000001062c82c4 swift::constraints::ConstraintSystem::getTypeOfMemberReference(swift::Type, swift::ValueDecl*, swift::DeclContext*, bool, swift::FunctionRefInfo, swift::constraints::ConstraintLocator*, llvm::SmallVectorImpl<std::__1::pair<swift::GenericTypeParamType*, swift::TypeVariableType*>>*) + 5616
25 swift-frontend           0x00000001062c9cac swift::constraints::ConstraintSystem::resolveOverload(swift::constraints::ConstraintLocator*, swift::Type, swift::constraints::OverloadChoice, swift::DeclContext*) + 360
26 swift-frontend           0x00000001061ad580 swift::constraints::ConstraintSystem::simplifyConstraint(swift::constraints::Constraint const&) + 1568
27 swift-frontend           0x000000010619e30c swift::constraints::ConstraintSystem::simplifyMemberConstraint(swift::constraints::ConstraintKind, swift::Type, swift::DeclNameRef, swift::Type, swift::DeclContext*, swift::FunctionRefInfo, llvm::ArrayRef<swift::constraints::OverloadChoice>, swift::optionset::OptionSet<swift::constraints::ConstraintSystem::TypeMatchFlags, unsigned int>, swift::constraints::ConstraintLocatorBuilder) + 2372
28 swift-frontend           0x0000000106170d20 swift::constraints::ConstraintSystem::addValueMemberConstraint(swift::Type, swift::DeclNameRef, swift::Type, swift::DeclContext*, swift::FunctionRefInfo, llvm::ArrayRef<swift::constraints::OverloadChoice>, swift::constraints::ConstraintLocatorBuilder) + 228
29 swift-frontend           0x00000001061719ac (anonymous namespace)::ConstraintGenerator::addSubscriptConstraints(swift::Expr*, swift::Type, swift::ValueDecl*, swift::ArgumentList*, swift::constraints::ConstraintLocator*, llvm::SmallVectorImpl<swift::TypeVariableType*>*) + 1284
30 swift-frontend           0x000000010616b0ec (anonymous namespace)::ConstraintWalker::walkToExprPost(swift::Expr*) + 11908
31 swift-frontend           0x00000001066dfeb8 (anonymous namespace)::Traversal::doIt(swift::Expr*) + 988
32 swift-frontend           0x00000001066dfad0 swift::Expr::walk(swift::ASTWalker&) + 32
33 swift-frontend           0x0000000106164c24 swift::constraints::ConstraintSystem::generateConstraints(swift::Expr*, swift::DeclContext*) + 180
34 swift-frontend           0x0000000106163514 swift::constraints::ConstraintSystem::generateConstraints(swift::constraints::SyntacticElementTarget&, swift::FreeTypeVariableBinding) + 524
35 swift-frontend           0x00000001061c2870 swift::constraints::ConstraintSystem::solveImpl(swift::constraints::SyntacticElementTarget&, swift::FreeTypeVariableBinding) + 408
36 swift-frontend           0x00000001061c2160 swift::constraints::ConstraintSystem::solve(swift::constraints::SyntacticElementTarget&, swift::FreeTypeVariableBinding) + 160
37 swift-frontend           0x000000010634fa98 swift::TypeChecker::typeCheckTarget(swift::constraints::SyntacticElementTarget&, swift::optionset::OptionSet<swift::TypeCheckExprFlags, unsigned int>, swift::DiagnosticTransaction*) + 296
38 swift-frontend           0x000000010634f914 swift::TypeChecker::typeCheckExpression(swift::constraints::SyntacticElementTarget&, swift::optionset::OptionSet<swift::TypeCheckExprFlags, unsigned int>, swift::DiagnosticTransaction*) + 196
39 swift-frontend           0x000000010634f7dc swift::TypeChecker::typeCheckExpression(swift::Expr*&, swift::DeclContext*, swift::constraints::ContextualTypeInfo, swift::optionset::OptionSet<swift::TypeCheckExprFlags, unsigned int>) + 96
40 swift-frontend           0x000000010641cf78 (anonymous namespace)::StmtChecker::typeCheckASTNode(swift::ASTNode&) + 252
41 swift-frontend           0x00000001064203a4 swift::ASTVisitor<(anonymous namespace)::StmtChecker, void, swift::Stmt*, void, void, void, void>::visit(swift::Stmt*) + 152
42 swift-frontend           0x000000010641eac8 bool (anonymous namespace)::StmtChecker::typeCheckStmt<swift::BraceStmt>(swift::BraceStmt*&) + 136
43 swift-frontend           0x000000010641e414 (anonymous namespace)::StmtChecker::typeCheckBody(swift::BraceStmt*&) + 48
44 swift-frontend           0x000000010641e124 swift::TypeCheckFunctionBodyRequest::evaluate(swift::Evaluator&, swift::AbstractFunctionDecl*) const + 1092
45 swift-frontend           0x00000001067e6a70 swift::TypeCheckFunctionBodyRequest::OutputType swift::Evaluator::getResultUncached<swift::TypeCheckFunctionBodyRequest, swift::TypeCheckFunctionBodyRequest::OutputType swift::evaluateOrDefault<swift::TypeCheckFunctionBodyRequest>(swift::Evaluator&, swift::TypeCheckFunctionBodyRequest, swift::TypeCheckFunctionBodyRequest::OutputType)::'lambda'()>(swift::TypeCheckFunctionBodyRequest const&, swift::TypeCheckFunctionBodyRequest::OutputType swift::evaluateOrDefault<swift::TypeCheckFunctionBodyRequest>(swift::Evaluator&, swift::TypeCheckFunctionBodyRequest, swift::TypeCheckFunctionBodyRequest::OutputType)::'lambda'()) + 240
46 swift-frontend           0x000000010675f910 swift::AbstractFunctionDecl::getTypecheckedBody() const + 112
47 swift-frontend           0x000000010688c650 swift::SourceFile::typeCheckDelayedFunctions() + 96
48 swift-frontend           0x0000000106466344 swift::TypeCheckPrimaryFileRequest::evaluate(swift::Evaluator&, swift::SourceFile*) const + 244
49 swift-frontend           0x0000000106467b9c swift::TypeCheckPrimaryFileRequest::OutputType swift::Evaluator::getResultUncached<swift::TypeCheckPrimaryFileRequest, swift::TypeCheckPrimaryFileRequest::OutputType swift::evaluateOrDefault<swift::TypeCheckPrimaryFileRequest>(swift::Evaluator&, swift::TypeCheckPrimaryFileRequest, swift::TypeCheckPrimaryFileRequest::OutputType)::'lambda'()>(swift::TypeCheckPrimaryFileRequest const&, swift::TypeCheckPrimaryFileRequest::OutputType swift::evaluateOrDefault<swift::TypeCheckPrimaryFileRequest>(swift::Evaluator&, swift::TypeCheckPrimaryFileRequest, swift::TypeCheckPrimaryFileRequest::OutputType)::'lambda'()) + 232
50 swift-frontend           0x0000000106466228 swift::performTypeChecking(swift::SourceFile&) + 84
51 swift-frontend           0x0000000105456c64 bool llvm::function_ref<bool (swift::SourceFile&)>::callback_fn<swift::CompilerInstance::performSema()::$_0>(long, swift::SourceFile&) + 16
52 swift-frontend           0x000000010544e190 swift::CompilerInstance::forEachFileToTypeCheck(llvm::function_ref<bool (swift::SourceFile&)>) + 164
53 swift-frontend           0x000000010544e0cc swift::CompilerInstance::performSema() + 76
54 swift-frontend           0x0000000105222688 withSemanticAnalysis(swift::CompilerInstance&, swift::FrontendObserver*, llvm::function_ref<bool (swift::CompilerInstance&)>, bool) + 60
55 swift-frontend           0x0000000105217f4c performCompile(swift::CompilerInstance&, int&, swift::FrontendObserver*) + 716
56 swift-frontend           0x0000000105217768 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 2244
57 swift-frontend           0x0000000104fdb1ac swift::mainEntry(int, char const**) + 3064
58 dyld                     0x000000019e18c274 start + 2840
zsh: abort      swift main.swift

Expected behavior

Compiler should not crash and compile as versions 6.0.3 and before.

Environment

$ swiftc -v
Apple Swift version 6.2-dev (LLVM 6e0f052df8282a3, Swift 659adcd)
Target: arm64-apple-macosx15.0

Additional information

The snippet that works with 6.0.3 and doesn't work with nightly is available at https://godbolt.org/z/7G9zWxffd

Metadata

Metadata

Assignees

Labels

bugA deviation from expected or documented behavior. Also: expected but undesirable behavior.compilerThe Swift compiler itselfconstrained existentialsFeature → existentials: constrained existentials such as 'any Collection<Int>'crashBug: A crash, i.e., an abnormal termination of softwareexistential member accessesFeature → existentials: existential member accessesexistentialsFeature: values of types like `any Collection`, `Any` and `AnyObject`; type-erased valuesgenericsFeature: generic declarations and typesswift 6.2type checkerArea → compiler: Semantic analysis

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions