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-8039] Overriding associatedtype with where extension does not works #50572

Closed
kateinoigakukun opened this issue Jun 19, 2018 · 3 comments
Closed
Labels
bug A deviation from expected or documented behavior. Also: expected but undesirable behavior. compiler The Swift compiler in itself conformances Feature → protocol: protocol conformances crash Bug: A crash, i.e., an abnormal termination of software generic constraints Feature → generics: generic constraints generics Feature: generic declarations and types type checker Area → compiler: Semantic analysis

Comments

@kateinoigakukun
Copy link
Member

kateinoigakukun commented Jun 19, 2018

Previous ID SR-8039
Radar rdar://problem/41251156
Original Reporter @kateinoigakukun
Type Bug
Additional Detail from JIRA
Votes 0
Component/s Compiler
Labels Bug, AcceptsInvalid, CompilerCrash
Assignee None
Priority Medium

md5: 25eb889d3eac3d9333fca943f0c8fc4c

Issue Description:

protocol P {
    associatedtype Assoc = A
}

struct A {}
struct B: P {
    typealias Assoc = Int
}

struct S<T>: P {}

extension S where T: P {
    typealias Assoc = T.Assoc
}

print(type(of: S<B>.Assoc.self))

Expected output is Int but this code can't be compiled.

0  swift                    0x000000010a250c5a PrintStackTraceSignalHandler(void*) + 42
1  swift                    0x000000010a250066 SignalHandler(int) + 966
2  libsystem_platform.dylib 0x00007fff6f348f5a _sigtramp + 26
3  libsystem_platform.dylib 0x000000010b810080 _sigtramp + 2622255424
4  swift                    0x0000000107a5ae69 llvm::Optional<swift::Type> llvm::function_ref<llvm::Optional<swift::Type> (swift::TypeBase*)>::callback_fn<swift::Type::transform(llvm::function_ref<swift::Type (swift::Type)>) const::$_15>(long, swift::TypeBase*) + 25
5  swift                    0x0000000107a5aed8 swift::Type::transformRec(llvm::function_ref<llvm::Optional<swift::Type> (swift::TypeBase*)>) const + 56
6  swift                    0x000000010675572c swift::irgen::IRGenFunction::emitTypeMetadataRef(swift::CanType, swift::irgen::DynamicMetadataRequest) + 76
7  swift                    0x00000001067554c2 (anonymous namespace)::EmitTypeMetadataRef::visitAnyMetatypeType(swift::CanTypeWrapper<swift::AnyMetatypeType>, swift::irgen::DynamicMetadataRequest) + 130
8  swift                    0x0000000106751e73 emitDirectTypeMetadataRef(swift::irgen::IRGenFunction&, swift::CanType, swift::irgen::DynamicMetadataRequest) + 339
9  swift                    0x0000000106751d04 swift::irgen::MetadataResponse llvm::function_ref<swift::irgen::MetadataResponse (swift::irgen::IRGenFunction&, swift::irgen::DynamicMetadataRequest, llvm::Constant*)>::callback_fn<swift::irgen::getTypeMetadataAccessFunction(swift::irgen::IRGenModule&, swift::CanType, swift::ForDefinition_t)::$_2>(long, swift::irgen::IRGenFunction&, swift::irgen::DynamicMetadataRequest, llvm::Constant*) + 500
10 swift                    0x0000000106751af9 swift::irgen::MetadataResponse llvm::function_ref<swift::irgen::MetadataResponse (swift::irgen::IRGenFunction&, swift::irgen::Explosion&)>::callback_fn<swift::irgen::getTypeMetadataAccessFunction(swift::irgen::IRGenModule&, swift::CanType, swift::ForDefinition_t, llvm::function_ref<swift::irgen::MetadataResponse (swift::irgen::IRGenFunction&, swift::irgen::DynamicMetadataRequest, llvm::Constant*)>)::$_1>(long, swift::irgen::IRGenFunction&, swift::irgen::Explosion&) + 89
11 swift                    0x0000000106750120 swift::irgen::emitLazyCacheAccessFunction(swift::irgen::IRGenModule&, llvm::Function*, llvm::GlobalVariable*, llvm::function_ref<swift::irgen::MetadataResponse (swift::irgen::IRGenFunction&, swift::irgen::Explosion&)>, bool) + 1504
12 swift                    0x0000000106751a8a swift::irgen::getTypeMetadataAccessFunction(swift::irgen::IRGenModule&, swift::CanType, swift::ForDefinition_t, llvm::function_ref<swift::irgen::MetadataResponse (swift::irgen::IRGenFunction&, swift::irgen::DynamicMetadataRequest, llvm::Constant*)>) + 506
13 swift                    0x0000000106755922 emitCallToTypeMetadataAccessFunction(swift::irgen::IRGenFunction&, swift::CanType, swift::irgen::DynamicMetadataRequest, swift::ForDefinition_t) + 114
14 swift                    0x00000001067557b3 swift::irgen::IRGenFunction::emitTypeMetadataRef(swift::CanType, swift::irgen::DynamicMetadataRequest) + 211
15 swift                    0x00000001067554c2 (anonymous namespace)::EmitTypeMetadataRef::visitAnyMetatypeType(swift::CanTypeWrapper<swift::AnyMetatypeType>, swift::irgen::DynamicMetadataRequest) + 130
16 swift                    0x0000000106751e73 emitDirectTypeMetadataRef(swift::irgen::IRGenFunction&, swift::CanType, swift::irgen::DynamicMetadataRequest) + 339
17 swift                    0x0000000106751d04 swift::irgen::MetadataResponse llvm::function_ref<swift::irgen::MetadataResponse (swift::irgen::IRGenFunction&, swift::irgen::DynamicMetadataRequest, llvm::Constant*)>::callback_fn<swift::irgen::getTypeMetadataAccessFunction(swift::irgen::IRGenModule&, swift::CanType, swift::ForDefinition_t)::$_2>(long, swift::irgen::IRGenFunction&, swift::irgen::DynamicMetadataRequest, llvm::Constant*) + 500
18 swift                    0x0000000106751af9 swift::irgen::MetadataResponse llvm::function_ref<swift::irgen::MetadataResponse (swift::irgen::IRGenFunction&, swift::irgen::Explosion&)>::callback_fn<swift::irgen::getTypeMetadataAccessFunction(swift::irgen::IRGenModule&, swift::CanType, swift::ForDefinition_t, llvm::function_ref<swift::irgen::MetadataResponse (swift::irgen::IRGenFunction&, swift::irgen::DynamicMetadataRequest, llvm::Constant*)>)::$_1>(long, swift::irgen::IRGenFunction&, swift::irgen::Explosion&) + 89
19 swift                    0x0000000106750120 swift::irgen::emitLazyCacheAccessFunction(swift::irgen::IRGenModule&, llvm::Function*, llvm::GlobalVariable*, llvm::function_ref<swift::irgen::MetadataResponse (swift::irgen::IRGenFunction&, swift::irgen::Explosion&)>, bool) + 1504
20 swift                    0x0000000106751a8a swift::irgen::getTypeMetadataAccessFunction(swift::irgen::IRGenModule&, swift::CanType, swift::ForDefinition_t, llvm::function_ref<swift::irgen::MetadataResponse (swift::irgen::IRGenFunction&, swift::irgen::DynamicMetadataRequest, llvm::Constant*)>) + 506
21 swift                    0x0000000106755922 emitCallToTypeMetadataAccessFunction(swift::irgen::IRGenFunction&, swift::CanType, swift::irgen::DynamicMetadataRequest, swift::ForDefinition_t) + 114
22 swift                    0x00000001067557b3 swift::irgen::IRGenFunction::emitTypeMetadataRef(swift::CanType, swift::irgen::DynamicMetadataRequest) + 211
23 swift                    0x00000001067554c2 (anonymous namespace)::EmitTypeMetadataRef::visitAnyMetatypeType(swift::CanTypeWrapper<swift::AnyMetatypeType>, swift::irgen::DynamicMetadataRequest) + 130
24 swift                    0x0000000106751e73 emitDirectTypeMetadataRef(swift::irgen::IRGenFunction&, swift::CanType, swift::irgen::DynamicMetadataRequest) + 339
25 swift                    0x0000000106751d04 swift::irgen::MetadataResponse llvm::function_ref<swift::irgen::MetadataResponse (swift::irgen::IRGenFunction&, swift::irgen::DynamicMetadataRequest, llvm::Constant*)>::callback_fn<swift::irgen::getTypeMetadataAccessFunction(swift::irgen::IRGenModule&, swift::CanType, swift::ForDefinition_t)::$_2>(long, swift::irgen::IRGenFunction&, swift::irgen::DynamicMetadataRequest, llvm::Constant*) + 500
26 swift                    0x0000000106751af9 swift::irgen::MetadataResponse llvm::function_ref<swift::irgen::MetadataResponse (swift::irgen::IRGenFunction&, swift::irgen::Explosion&)>::callback_fn<swift::irgen::getTypeMetadataAccessFunction(swift::irgen::IRGenModule&, swift::CanType, swift::ForDefinition_t, llvm::function_ref<swift::irgen::MetadataResponse (swift::irgen::IRGenFunction&, swift::irgen::DynamicMetadataRequest, llvm::Constant*)>)::$_1>(long, swift::irgen::IRGenFunction&, swift::irgen::Explosion&) + 89
27 swift                    0x0000000106750120 swift::irgen::emitLazyCacheAccessFunction(swift::irgen::IRGenModule&, llvm::Function*, llvm::GlobalVariable*, llvm::function_ref<swift::irgen::MetadataResponse (swift::irgen::IRGenFunction&, swift::irgen::Explosion&)>, bool) + 1504
28 swift                    0x0000000106751a8a swift::irgen::getTypeMetadataAccessFunction(swift::irgen::IRGenModule&, swift::CanType, swift::ForDefinition_t, llvm::function_ref<swift::irgen::MetadataResponse (swift::irgen::IRGenFunction&, swift::irgen::DynamicMetadataRequest, llvm::Constant*)>) + 506
29 swift                    0x00000001066a41c8 swift::SILWitnessVisitor<(anonymous namespace)::WitnessTableBuilder>::visitProtocolDecl(swift::ProtocolDecl*)::'lambda'()::operator()() const + 1944
30 swift                    0x00000001066a388f swift::SILWitnessVisitor<(anonymous namespace)::WitnessTableBuilder>::visitProtocolDecl(swift::ProtocolDecl*) + 5807
31 swift                    0x000000010669fcae swift::irgen::IRGenModule::emitSILWitnessTable(swift::SILWitnessTable*) + 1310
32 swift                    0x00000001065ef11b swift::irgen::IRGenerator::emitGlobalTopLevel(bool) + 2491
33 swift                    0x00000001066e37fa performIRGeneration(swift::IRGenOptions&, swift::ModuleDecl*, std::__1::unique_ptr<swift::SILModule, std::__1::default_delete<swift::SILModule> >, llvm::StringRef, swift::PrimarySpecificPaths const&, llvm::LLVMContext&, swift::SourceFile*, llvm::GlobalVariable**, unsigned int) + 1386
34 swift                    0x00000001066e05f7 swift::performIRGeneration(swift::IRGenOptions&, swift::ModuleDecl*, std::__1::unique_ptr<swift::SILModule, std::__1::default_delete<swift::SILModule> >, llvm::StringRef, swift::PrimarySpecificPaths const&, llvm::LLVMContext&, llvm::ArrayRef<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, llvm::GlobalVariable**) + 727
35 swift                    0x000000010652f0ff performCompile(swift::CompilerInstance&, swift::CompilerInvocation&, llvm::ArrayRef<char const*>, int&, swift::FrontendObserver*, swift::UnifiedStatsReporter*) + 47871
36 swift                    0x000000010652010f swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 7839
37 swift                    0x00000001064c9c48 main + 13144
38 libdyld.dylib            0x00007fff6f03a015 start + 1

@belkadan
Copy link
Contributor

I think this is just a bug: you say that S conforms to P unconditionally, but that S.Assoc only has a value when T also conforms to P. That should be an error.

@belkadan
Copy link
Contributor

@swift-ci create

@rintaro
Copy link
Mannequin

rintaro mannequin commented Jun 20, 2018

Just to clarify the originator's intent:
Since P.Assoc has default value A, this code expects S<B>.Assoc == Int and S<Int>.Assoc == A.

Another simplified example:

protocol P {
    associatedtype Assoc = Int
}

struct S<T>: P {}

extension S where T == String {
    typealias Assoc = UInt8
}

print(S<Float>.Assoc.self)

In Swift4.2, this compiles and prints UInt8. (unexpected behavior)
In master, it's typecheck error:

test.swift:11:7: error: 'S<Int>.Assoc.Type' (aka 'UInt8.Type') requires the types 'Int' and 'String' be equivalent
print(S<Int>.Assoc.self)
      ^

The error message is understandable, but still confusing.

@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
@AnthonyLatsis AnthonyLatsis added type checker Area → compiler: Semantic analysis conformances Feature → protocol: protocol conformances generics Feature: generic declarations and types generic constraints Feature → generics: generic constraints and removed accepts invalid Bug: Accepts invalid labels Oct 22, 2023
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 conformances Feature → protocol: protocol conformances crash Bug: A crash, i.e., an abnormal termination of software generic constraints Feature → generics: generic constraints generics Feature: generic declarations and types type checker Area → compiler: Semantic analysis
Projects
None yet
Development

No branches or pull requests

3 participants