Closed
Description
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
Bug → crash: An assertion failureA deviation from expected or documented behavior. Also: expected but undesirable behavior.The Swift compiler itselfFeature → existentials: constrained existentials such as 'any Collection<Int>'Bug: A crash, i.e., an abnormal termination of softwareFeature → existentials: existential member accessesFeature: values of types like `any Collection`, `Any` and `AnyObject`; type-erased valuesFeature: expressionsArea → compiler: Semantic analysisFeature: types