Skip to content

Compiler crash when using incorrectly typed primary assiciated type #67337

Closed
@vishesh

Description

@vishesh

When using primary associated types in protocols as shown in program below, Swift

Steps to reproduce

protocol P<T> {
    associatedtype T
    func foo() -> any P<T>
}

struct A: P {
    typealias T = Int
    var x = 0

    func foo() -> any P<T> {
        A(x: x + 1)
    }
}

struct B: P {
    typealias T = Int
    var x: T
    func foo() -> any P<T> {
        B(x: x + x)
    }
}

func run(_ x: Int) -> any P {
    if x % 2 == 0 {
        return A(x: 0)
    } else {
        return B(x: 1)
    }
}

if let name = readLine() {
    if let n = Int(name) {
        let p = run(n)
        let p1 = p.foo()
        p1.bar()
    }
}

Expected behavior
Should fail typechecker than crash.

Unhandled coercion:
(existential_type
  (protocol_composition_type))
(opened_archetype_type address=0x13bb46b70
  (interface_type=dependent_member_type assoc_type=Try.(file)[email protected]:2:20
    (base=generic_type_param_type depth=0 index=0))
  (opened_existential=existential_type
    (protocol_type decl=Try.(file)[email protected]:1:10)) opened_existential_id=A1092A90-24CC-11EE-A3B3-C6C48DCC1F7A)
Stack dump:
0.      Program arguments: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-frontend -frontend -interpret Try.swift -Xllvm -aarch64-use-tbi -enable-objc-interop -stack-check -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.3.sdk -color-diagnostics -new-driver-path /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-driver -empty-abi-descriptor -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift -module-name Try -disable-clang-spi -target-sdk-version 13.3 -target-sdk-name macosx13.3
1.      Apple Swift version 5.8.1 (swiftlang-5.8.0.124.5 clang-1403.0.22.11.100)
2.      Compiling with the current language version
3.      While evaluating request TypeCheckSourceFileRequest(source_file "Try.swift")
4.      While type-checking statement at [Try.swift:48:1 - line:54:1] RangeText="if let name = readLine() {
    if let n = Int(name) {
        let p = run(n)
        let p1 = p.foo()
        p1.bar()
    }
"
5.      While type-checking statement at [Try.swift:48:1 - line:54:1] RangeText="if let name = readLine() {
    if let n = Int(name) {
        let p = run(n)
        let p1 = p.foo()
        p1.bar()
    }
"
6.      While type-checking statement at [Try.swift:48:26 - line:54:1] RangeText="{
    if let n = Int(name) {
        let p = run(n)
        let p1 = p.foo()
        p1.bar()
    }
"
7.      While type-checking statement at [Try.swift:49:5 - line:53:5] RangeText="if let n = Int(name) {
        let p = run(n)
        let p1 = p.foo()
        p1.bar()
    "
8.      While type-checking statement at [Try.swift:49:26 - line:53:5] RangeText="{
        let p = run(n)
        let p1 = p.foo()
        p1.bar()
    "
9.      While type-checking declaration 0x13b9522a0 (at Try.swift:51:9)
10.     While evaluating request PatternBindingEntryRequest((unknown decl), 0, 0)
11.     While type-checking expression at [Try.swift:51:18 - line:51:24] RangeText="p.foo("
12.     While type-checking-target starting at Try.swift:51:20
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           0x000000010746f2a8 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) + 56
1  swift-frontend           0x000000010746e28c llvm::sys::RunSignalHandlers() + 112
2  swift-frontend           0x000000010746f8b8 SignalHandler(int) + 344
3  libsystem_platform.dylib 0x00000001957daa24 _sigtramp + 56
4  libsystem_pthread.dylib  0x00000001957abc28 pthread_kill + 288
5  libsystem_c.dylib        0x00000001956b9ae8 abort + 180
6  swift-frontend           0x00000001032d3750 (anonymous namespace)::ExprRewriter::coerceToType(swift::Expr*, swift::Type, swift::constraints::ConstraintLocatorBuilder, llvm::Optional<swift::Pattern*>) + 8756
7  swift-frontend           0x00000001032fc078 (anonymous namespace)::ExprRewriter::coerceExistential(swift::Expr*, swift::Type, swift::constraints::ConstraintLocatorBuilder) + 2172
8  swift-frontend           0x00000001032d2e74 (anonymous namespace)::ExprRewriter::coerceToType(swift::Expr*, swift::Type, swift::constraints::ConstraintLocatorBuilder, llvm::Optional<swift::Pattern*>) + 6488
9  swift-frontend           0x00000001032d1458 swift::constraints::Solution::coerceToType(swift::Expr*, swift::Type, swift::constraints::ConstraintLocator*, llvm::Optional<swift::Pattern*>) + 188
10 swift-frontend           0x00000001032f9030 applySolutionToInitialization(swift::constraints::Solution&, swift::constraints::SolutionApplicationTarget, swift::Expr*) + 616
11 swift-frontend           0x00000001032d0110 (anonymous namespace)::ExprWalker::rewriteTarget(swift::constraints::SolutionApplicationTarget) + 4432
12 swift-frontend           0x00000001032cead4 swift::constraints::ConstraintSystem::applySolution(swift::constraints::Solution&, swift::constraints::SolutionApplicationTarget) + 7264
13 swift-frontend           0x0000000103557dd4 swift::TypeChecker::typeCheckTarget(swift::constraints::SolutionApplicationTarget&, swift::OptionSet<swift::TypeCheckExprFlags, unsigned int>) + 708
14 swift-frontend           0x00000001035579dc swift::TypeChecker::typeCheckExpression(swift::constraints::SolutionApplicationTarget&, swift::OptionSet<swift::TypeCheckExprFlags, unsigned int>) + 400
15 swift-frontend           0x000000010355910c swift::TypeChecker::typeCheckBinding(swift::Pattern*&, swift::Expr*&, swift::DeclContext*, swift::Type, swift::PatternBindingDecl*, unsigned int, swift::OptionSet<swift::TypeCheckExprFlags, unsigned int>) + 448
16 swift-frontend           0x0000000103559358 swift::TypeChecker::typeCheckPatternBinding(swift::PatternBindingDecl*, unsigned int, swift::Type, swift::OptionSet<swift::TypeCheckExprFlags, unsigned int>) + 332
17 swift-frontend           0x000000010364ff00 swift::PatternBindingEntryRequest::evaluate(swift::Evaluator&, swift::PatternBindingDecl*, unsigned int, bool) const + 3368
18 swift-frontend           0x000000010357e414 llvm::Expected<swift::PatternBindingEntryRequest::OutputType> swift::Evaluator::getResultUncached<swift::PatternBindingEntryRequest>(swift::PatternBindingEntryRequest const&) + 652
19 swift-frontend           0x000000010356ec64 swift::PatternBindingEntryRequest::OutputType swift::evaluateOrDefault<swift::PatternBindingEntryRequest>(swift::Evaluator&, swift::PatternBindingEntryRequest, swift::PatternBindingEntryRequest::OutputType) + 60
20 swift-frontend           0x00000001035a611c (anonymous namespace)::DeclChecker::visit(swift::Decl*) + 6428
21 swift-frontend           0x000000010364634c (anonymous namespace)::StmtChecker::typeCheckASTNode(swift::ASTNode&) + 860
22 swift-frontend           0x0000000103649fa0 swift::ASTVisitor<(anonymous namespace)::StmtChecker, void, swift::Stmt*, void, void, void, void>::visit(swift::Stmt*) + 292
23 swift-frontend           0x0000000103649d24 bool (anonymous namespace)::StmtChecker::typeCheckStmt<swift::Stmt>(swift::Stmt*&) + 320
24 swift-frontend           0x000000010364a638 swift::ASTVisitor<(anonymous namespace)::StmtChecker, void, swift::Stmt*, void, void, void, void>::visit(swift::Stmt*) + 1980
25 swift-frontend           0x0000000103649d24 bool (anonymous namespace)::StmtChecker::typeCheckStmt<swift::Stmt>(swift::Stmt*&) + 320
26 swift-frontend           0x0000000103646048 (anonymous namespace)::StmtChecker::typeCheckASTNode(swift::ASTNode&) + 88
27 swift-frontend           0x0000000103649fa0 swift::ASTVisitor<(anonymous namespace)::StmtChecker, void, swift::Stmt*, void, void, void, void>::visit(swift::Stmt*) + 292
28 swift-frontend           0x0000000103649d24 bool (anonymous namespace)::StmtChecker::typeCheckStmt<swift::Stmt>(swift::Stmt*&) + 320
29 swift-frontend           0x000000010364a638 swift::ASTVisitor<(anonymous namespace)::StmtChecker, void, swift::Stmt*, void, void, void, void>::visit(swift::Stmt*) + 1980
30 swift-frontend           0x0000000103649d24 bool (anonymous namespace)::StmtChecker::typeCheckStmt<swift::Stmt>(swift::Stmt*&) + 320
31 swift-frontend           0x0000000103646048 (anonymous namespace)::StmtChecker::typeCheckASTNode(swift::ASTNode&) + 88
32 swift-frontend           0x0000000103649fa0 swift::ASTVisitor<(anonymous namespace)::StmtChecker, void, swift::Stmt*, void, void, void, void>::visit(swift::Stmt*) + 292
33 swift-frontend           0x00000001036487b4 bool (anonymous namespace)::StmtChecker::typeCheckStmt<swift::BraceStmt>(swift::BraceStmt*&) + 320
34 swift-frontend           0x000000010368a838 swift::TypeCheckSourceFileRequest::evaluate(swift::Evaluator&, swift::SourceFile*) const + 712
35 swift-frontend           0x000000010368f9ec llvm::Expected<swift::TypeCheckSourceFileRequest::OutputType> swift::Evaluator::getResultUncached<swift::TypeCheckSourceFileRequest>(swift::TypeCheckSourceFileRequest const&) + 680
36 swift-frontend           0x000000010368f6b0 llvm::Expected<swift::TypeCheckSourceFileRequest::OutputType> swift::Evaluator::getResultCached<swift::TypeCheckSourceFileRequest, (void*)0>(swift::TypeCheckSourceFileRequest const&) + 240
37 swift-frontend           0x000000010368a508 swift::performTypeChecking(swift::SourceFile&) + 88
38 swift-frontend           0x00000001024f9554 swift::CompilerInstance::performSema() + 308
39 swift-frontend           0x000000010235fee0 performCompile(swift::CompilerInstance&, int&, swift::FrontendObserver*) + 464
40 swift-frontend           0x000000010235e874 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 4308
41 swift-frontend           0x00000001023235bc swift::mainEntry(int, char const**) + 4116
42 dyld                     0x0000000195453f28 start + 2236
[1]    76300 abort      swift Try.swift

Environment

  • Swift compiler version info swift-driver version: 1.75.2 Apple Swift version 5.8.1 (swiftlang-5.8.0.124.5 clang-1403.0.22.11.100)Target: arm64-apple-macosx13.0
  • Xcode version info Build version 14E300c

Metadata

Metadata

Assignees

Labels

assertion failureBug → crash: An assertion failurebugA 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 valuesexpressionsFeature: expressionsswift 5.10type checkerArea → compiler: Semantic analysistypesFeature: types

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions