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-7337] Compiler crash subclassing generic class in tests with conditional conformance in app target #49885

Closed
swift-ci opened this issue Apr 2, 2018 · 16 comments
Assignees
Labels
bug A deviation from expected or documented behavior. Also: expected but undesirable behavior. compiler The Swift compiler in itself crash Bug: A crash, i.e., an abnormal termination of software serialization Area → compiler: Serialization & deserialization

Comments

@swift-ci
Copy link
Collaborator

swift-ci commented Apr 2, 2018

Previous ID SR-7337
Radar rdar://problem/39142121
Original Reporter benasher44 (JIRA User)
Type Bug
Status Closed
Resolution Done

Attachment: Download

Environment

macOS 10.13.4

Xcode 7.3 w/ Swift 4.1 from App Store

Additional Detail from JIRA
Votes 0
Component/s Compiler
Labels Bug, CompilerCrash, Serialization
Assignee @belkadan
Priority Medium

md5: 05dc7a2cd6bab6156a1bfcd31ba111b9

Issue Description:

We've been able to use some of the new conditional conformance features, which we're excited about! Unfortunately, we ran into one scenario the causes the compiler to crash. Here's the top down view of the app/scenario:

AppTarget

  • Conditional conformance declared for a library class here

    LibraryTarget. (imported in the AppTarget)

  • Declares the library class referred to in AppTarget

    AppTestTarget

  • Subclasses library class referred to in AppTarget

    This scenario appears to cause this crash:

    :0: error: fatal error encountered while reading from module 'ConditionalConformanceCrashTests'; please file a bug report with your project and the crash log

    *** DESERIALIZATION FAILURE (please include this section in any bug report) ***
    (see "While..." info below)
    0 swift 0x0000000105a35ffa PrintStackTraceSignalHandler(void*) + 42
    1 swift 0x0000000105a353b6 SignalHandler(int) + 966
    2 libsystem_platform.dylib 0x00007fff612c7f5a _sigtramp + 26
    3 swift 0x00000001063ac900 (anonymous namespace)::DarwinX86AsmBackend::getCompactUnwindRegNum(unsigned int) const::CU32BitRegs + 103838
    4 libsystem_c.dylib 0x00007fff610651ae abort + 127
    5 swift 0x0000000103163bae swift::ModuleFile::fatal(llvm::Error) + 2062
    6 swift 0x0000000103175dce swift::ModuleFile::getTypeChecked(llvm::PointerEmbeddedInt<unsigned int, 31>) + 12958
    7 swift 0x000000010317ab11 swift::ModuleFile::maybeReadSubstitution(llvm::BitstreamCursor&, swift::GenericEnvironment*) + 177
    8 swift 0x000000010317bab0 swift::ModuleFile::readConformance(llvm::BitstreamCursor&, swift::GenericEnvironment*) + 3136
    9 swift 0x000000010317b4bf swift::ModuleFile::readConformance(llvm::BitstreamCursor&, swift::GenericEnvironment*) + 1615
    10 swift 0x000000010317e65c swift::ModuleFile::loadAllConformances(swift::Decl const*, unsigned long long, llvm::SmallVectorImplswift::ProtocolConformance\*&) + 300
    11 swift 0x00000001033fcf86 swift::ConformanceLookupTable::updateLookupTable(swift::NominalTypeDecl*, swift::ConformanceLookupTable::ConformanceStage, swift::LazyResolver*) + 838
    12 swift 0x00000001033fcd37 swift::ConformanceLookupTable::updateLookupTable(swift::NominalTypeDecl*, swift::ConformanceLookupTable::ConformanceStage, swift::LazyResolver*) + 247
    13 swift 0x00000001033fcdaa swift::ConformanceLookupTable::updateLookupTable(swift::NominalTypeDecl*, swift::ConformanceLookupTable::ConformanceStage, swift::LazyResolver*) + 362
    14 swift 0x000000010348fec1 swift::NominalTypeDecl::getAllProtocols() const + 161
    15 swift 0x0000000102a60534 (anonymous namespace)::NominalTypeWalker::walkToDeclPre(swift::Decl*) + 68
    16 swift 0x00000001033e8301 (anonymous namespace)::Traversal::doIt(swift::Decl*) + 273
    17 swift 0x0000000102b8d61f swift::SILPassManager::SILPassManager(swift::SILModule*, llvm::StringRef, bool) + 1903
    18 swift 0x00000001020942ab performCompile(swift::CompilerInstance&, swift::CompilerInvocation&, llvm::ArrayRef<char const*>, int&, swift::FrontendObserver*, swift::UnifiedStatsReporter*) + 31163
    19 swift 0x000000010208ae64 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 7908
    20 swift 0x000000010203f8b5 main + 18917
    21 libdyld.dylib 0x00007fff60fb9015 start + 1
    22 libdyld.dylib 0x0000000000000044 start + 2667868208
    Stack dump:
    0. Program arguments: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -frontend -merge-modules -emit-module /Users/basher/Library/Developer/Xcode/DerivedData/ConditionalConformanceCrash-gvnepvsuprnuwzerdjvrbfjgogub/Build/Intermediates.noindex/ConditionalConformanceCrash.build/Debug-iphonesimulator/ConditionalConformanceCrashTests.build/Objects-normal/x86_64/ConditionalConformanceCrashTests~partial.swiftmodule -parse-as-library -sil-merge-partial-modules -disable-diagnostic-passes -disable-sil-perf-optzns -target x86_64-apple-ios11.3 -enable-objc-interop -sdk /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator11.3.sdk -I /Users/basher/Library/Developer/Xcode/DerivedData/ConditionalConformanceCrash-gvnepvsuprnuwzerdjvrbfjgogub/Build/Products/Debug-iphonesimulator -F /Users/basher/Library/Developer/Xcode/DerivedData/ConditionalConformanceCrash-gvnepvsuprnuwzerdjvrbfjgogub/Build/Products/Debug-iphonesimulator -F /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks -enable-testing -g -module-cache-path /Users/basher/Library/Developer/Xcode/DerivedData/ModuleCache.noindex -swift-version 4 -enforce-exclusivity=checked -Onone -D DEBUG -serialize-debugging-options -serialize-debugging-options -Xcc -I/Users/basher/Library/Developer/Xcode/DerivedData/ConditionalConformanceCrash-gvnepvsuprnuwzerdjvrbfjgogub/Build/Intermediates.noindex/ConditionalConformanceCrash.build/Debug-iphonesimulator/ConditionalConformanceCrashTests.build/swift-overrides.hmap -Xcc -iquote -Xcc /Users/basher/Library/Developer/Xcode/DerivedData/ConditionalConformanceCrash-gvnepvsuprnuwzerdjvrbfjgogub/Build/Intermediates.noindex/ConditionalConformanceCrash.build/Debug-iphonesimulator/ConditionalConformanceCrashTests.build/ConditionalConformanceCrashTests-generated-files.hmap -Xcc -I/Users/basher/Library/Developer/Xcode/DerivedData/ConditionalConformanceCrash-gvnepvsuprnuwzerdjvrbfjgogub/Build/Intermediates.noindex/ConditionalConformanceCrash.build/Debug-iphonesimulator/ConditionalConformanceCrashTests.build/ConditionalConformanceCrashTests-own-target-headers.hmap -Xcc -I/Users/basher/Library/Developer/Xcode/DerivedData/ConditionalConformanceCrash-gvnepvsuprnuwzerdjvrbfjgogub/Build/Intermediates.noindex/ConditionalConformanceCrash.build/Debug-iphonesimulator/ConditionalConformanceCrashTests.build/ConditionalConformanceCrashTests-all-non-framework-target-headers.hmap -Xcc -ivfsoverlay -Xcc /Users/basher/Library/Developer/Xcode/DerivedData/ConditionalConformanceCrash-gvnepvsuprnuwzerdjvrbfjgogub/Build/Intermediates.noindex/ConditionalConformanceCrash.build/all-product-headers.yaml -Xcc -iquote -Xcc /Users/basher/Library/Developer/Xcode/DerivedData/ConditionalConformanceCrash-gvnepvsuprnuwzerdjvrbfjgogub/Build/Intermediates.noindex/ConditionalConformanceCrash.build/Debug-iphonesimulator/ConditionalConformanceCrashTests.build/ConditionalConformanceCrashTests-project-headers.hmap -Xcc -I/Users/basher/Library/Developer/Xcode/DerivedData/ConditionalConformanceCrash-gvnepvsuprnuwzerdjvrbfjgogub/Build/Products/Debug-iphonesimulator/include -Xcc -I/Users/basher/Library/Developer/Xcode/DerivedData/ConditionalConformanceCrash-gvnepvsuprnuwzerdjvrbfjgogub/Build/Intermediates.noindex/ConditionalConformanceCrash.build/Debug-iphonesimulator/ConditionalConformanceCrashTests.build/DerivedSources/x86_64 -Xcc -I/Users/basher/Library/Developer/Xcode/DerivedData/ConditionalConformanceCrash-gvnepvsuprnuwzerdjvrbfjgogub/Build/Intermediates.noindex/ConditionalConformanceCrash.build/Debug-iphonesimulator/ConditionalConformanceCrashTests.build/DerivedSources -Xcc -DDEBUG=1 -Xcc -working-directory/Users/basher/Code/ConditionalConformanceCrash -emit-module-doc-path /Users/basher/Library/Developer/Xcode/DerivedData/ConditionalConformanceCrash-gvnepvsuprnuwzerdjvrbfjgogub/Build/Intermediates.noindex/ConditionalConformanceCrash.build/Debug-iphonesimulator/ConditionalConformanceCrashTests.build/Objects-normal/x86_64/ConditionalConformanceCrashTests.swiftdoc -module-name ConditionalConformanceCrashTests -emit-objc-header-path /Users/basher/Library/Developer/Xcode/DerivedData/ConditionalConformanceCrash-gvnepvsuprnuwzerdjvrbfjgogub/Build/Intermediates.noindex/ConditionalConformanceCrash.build/Debug-iphonesimulator/ConditionalConformanceCrashTests.build/Objects-normal/x86_64/ConditionalConformanceCrashTests-Swift.h -o /Users/basher/Library/Developer/Xcode/DerivedData/ConditionalConformanceCrash-gvnepvsuprnuwzerdjvrbfjgogub/Build/Intermediates.noindex/ConditionalConformanceCrash.build/Debug-iphonesimulator/ConditionalConformanceCrashTests.build/Objects-normal/x86_64/ConditionalConformanceCrashTests.swiftmodule

    1. While loading conformances for 'MockModelFactory' in module 'ConditionalConformanceCrashTests'
    2. While reading inherited conformance for type 'MockModelFactory'
    3. While reading specialized conformance for type 'ModelFactory'

    I've attached a sample project that reproduces the crash when building for test (i.e. command + shift + u) for the main app target entitled "ConditionalConformanceCrash" in the sample project.

@belkadan
Copy link
Contributor

belkadan commented Apr 3, 2018

@swift-ci create

@belkadan
Copy link
Contributor

belkadan commented Apr 4, 2018

With asserts:

Assertion failed: (!ty->hasError() && "Serializing error type"), function addTypeRef, file /Volumes/Data/internal/swift/lib/Serialization/Serialization.cpp, line 628.

1. While serializing 'MockModelFactory' at /Users/jrose/Downloads/ConditionalConformanceCrash/ConditionalConformanceCrashTests/ConditionalConformanceCrashTests.swift:13:7

2. While serializing type 'SampleObject'

@huonw
Copy link
Mannequin

huonw mannequin commented Apr 5, 2018

Reduced:

// sr_7337_1.swift
open class ModelFactory<T> {}
public struct SampleObject {}
extension ModelFactory: CustomDebugStringConvertible where T: CustomDebugStringConvertible {
    public var debugDescription: String {
        return ""
    }
}
// sr_7337_2.swift
import sr_7337_1

final class MockModelFactory: ModelFactory<SampleObject> {}
$ .../swiftc sr_7337_1.swift -emit-module
$ .../swiftc sr_7337_2.swift -I. -emit-module
Assertion failed: (!ty->hasError() && "Serializing error type"), function addTypeRef, file /Users/huon/projects/swift3/swift/lib/Serialization/Serialization.cpp, line 628.
0  swift                    0x000000010d5774e8 llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 40
1  swift                    0x000000010d577bf6 SignalHandler(int) + 694
2  libsystem_platform.dylib 0x00007fff70db0f5a _sigtramp + 26
3  libsystem_platform.dylib 000000000000000000 _sigtramp + 2401562816
4  libsystem_c.dylib        0x00007fff70bdb312 abort + 127
5  libsystem_c.dylib        0x00007fff70ba3368 basename_r + 0
6  swift                    0x000000010abad030 swift::serialization::Serializer::addTypeRef(swift::Type) + 416
7  swift                    0x000000010abb4bd1 swift::serialization::Serializer::writeSubstitutions(llvm::ArrayRef<swift::Substitution>, std::__1::array<unsigned int, 256ul> const&, swift::GenericEnvironment*) + 161
8  swift                    0x000000010abb48df swift::serialization::Serializer::writeConformance(swift::ProtocolConformanceRef, std::__1::array<unsigned int, 256ul> const&, swift::GenericEnvironment*) + 751
9  swift                    0x000000010abbc5b7 swift::serialization::Serializer::writeDecl(swift::Decl const*) + 9623
10 swift                    0x000000010abc5cb2 swift::serialization::Serializer::writeAllDeclsAndTypes() + 3346
11 swift                    0x000000010abc70f8 swift::serialization::Serializer::writeAST(llvm::PointerUnion<swift::ModuleDecl*, swift::SourceFile*>, bool) + 3400
12 swift                    0x000000010abce27b swift::serialization::Serializer::writeToStream(llvm::raw_ostream&, llvm::PointerUnion<swift::ModuleDecl*, swift::SourceFile*>, swift::SILModule const*, swift::SerializationOptions const&) + 139
13 swift                    0x000000010ac13133 void llvm::function_ref<void (llvm::raw_ostream&)>::callback_fn<swift::serialize(llvm::PointerUnion<swift::ModuleDecl*, swift::SourceFile*>, swift::SerializationOptions const&, swift::SILModule const*)::$_4>(long, llvm::raw_ostream&) + 179
14 swift                    0x000000010abcf4d8 withOutputFile(swift::ASTContext&, llvm::StringRef, llvm::function_ref<void (llvm::raw_ostream&)>) + 440
15 swift                    0x000000010abcf29c swift::serialize(llvm::PointerUnion<swift::ModuleDecl*, swift::SourceFile*>, swift::SerializationOptions const&, swift::SILModule const*) + 220
16 swift                    0x0000000109831894 performCompileStepsPostSILGen(swift::CompilerInstance&, swift::CompilerInvocation&, std::__1::unique_ptr<swift::SILModule, std::__1::default_delete<swift::SILModule> >, bool, llvm::PointerUnion<swift::ModuleDecl*, swift::SourceFile*>, swift::PrimarySpecificPaths const&, bool, int&, swift::FrontendObserver*, swift::UnifiedStatsReporter*)::$_9::operator()() const + 340
17 swift                    0x000000010983172d void std::__1::__invoke_void_return_wrapper<void>::__call<performCompileStepsPostSILGen(swift::CompilerInstance&, swift::CompilerInvocation&, std::__1::unique_ptr<swift::SILModule, std::__1::default_delete<swift::SILModule> >, bool, llvm::PointerUnion<swift::ModuleDecl*, swift::SourceFile*>, swift::PrimarySpecificPaths const&, bool, int&, swift::FrontendObserver*, swift::UnifiedStatsReporter*)::$_9&>(performCompileStepsPostSILGen(swift::CompilerInstance&, swift::CompilerInvocation&, std::__1::unique_ptr<swift::SILModule, std::__1::default_delete<swift::SILModule> >, bool, llvm::PointerUnion<swift::ModuleDecl*, swift::SourceFile*>, swift::PrimarySpecificPaths const&, bool, int&, swift::FrontendObserver*, swift::UnifiedStatsReporter*)::$_9&&&) + 45
18 swift                    0x00000001098316d9 std::__1::__function::__func<performCompileStepsPostSILGen(swift::CompilerInstance&, swift::CompilerInvocation&, std::__1::unique_ptr<swift::SILModule, std::__1::default_delete<swift::SILModule> >, bool, llvm::PointerUnion<swift::ModuleDecl*, swift::SourceFile*>, swift::PrimarySpecificPaths const&, bool, int&, swift::FrontendObserver*, swift::UnifiedStatsReporter*)::$_9, std::__1::allocator<performCompileStepsPostSILGen(swift::CompilerInstance&, swift::CompilerInvocation&, std::__1::unique_ptr<swift::SILModule, std::__1::default_delete<swift::SILModule> >, bool, llvm::PointerUnion<swift::ModuleDecl*, swift::SourceFile*>, swift::PrimarySpecificPaths const&, bool, int&, swift::FrontendObserver*, swift::UnifiedStatsReporter*)::$_9>, void ()>::operator()() + 41
19 swift                    0x000000010a57c244 swift::SILModule::serialize() + 36
20 swift                    0x0000000109813745 performCompileStepsPostSILGen(swift::CompilerInstance&, swift::CompilerInvocation&, std::__1::unique_ptr<swift::SILModule, std::__1::default_delete<swift::SILModule> >, bool, llvm::PointerUnion<swift::ModuleDecl*, swift::SourceFile*>, swift::PrimarySpecificPaths const&, bool, int&, swift::FrontendObserver*, swift::UnifiedStatsReporter*) + 5461
21 swift                    0x0000000109803778 performCompile(swift::CompilerInstance&, swift::CompilerInvocation&, llvm::ArrayRef<char const*>, int&, swift::FrontendObserver*, swift::UnifiedStatsReporter*) + 3944
22 swift                    0x0000000109800ae4 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 5060
23 swift                    0x00000001097bfe03 main + 2051
24 libdyld.dylib            0x00007fff70b2f115 start + 1
25 libdyld.dylib            0x0000000000000010 start + 2404191996
Stack dump:
0.  Program arguments: /Users/huon/projects/swift3/build/Ninja-RelWithDebInfoAssert/swift-macosx-x86_64/bin/swift -frontend -emit-module -primary-file sr_7337_2.swift -emit-module-doc-path /var/folders/3k/4q7m7bkn2k750rpr0jm8s9fr0000gn/T/sr_7337_2-5be9f2.swiftdoc -target x86_64-apple-darwin17.3.0 -enable-objc-interop -I . -module-name sr_7337_2 -o /var/folders/3k/4q7m7bkn2k750rpr0jm8s9fr0000gn/T/sr_7337_2-5be9f2.swiftmodule 
1.  While serializing 'MockModelFactory' at sr_7337_2.swift:3:7
2.  While serializing type 'SampleObject'
<unknown>:0: error: unable to execute command: Abort trap: 6
<unknown>:0: error: compile command failed due to signal 6 (use -v to see invocation)

@belkadan
Copy link
Contributor

Aha, so an inherited conditional conformance may turn out to never be satisfied. Should we have marked the conformance invalid somehow in this case? Should it have never been added?

(I'm pretty sure @DougGregor thinks it's safe to not serialized inherited conformances at all. After all, inherited conformances can't handle retroactive conformances on the base type anyway.)

@swift-ci
Copy link
Collaborator Author

Comment by Ben A (JIRA)

If the conformance is meant to be invalid, that seems reasonable as long as there’s an error that clearly calls out why if you try to use it.

@swift-ci
Copy link
Collaborator Author

Comment by Ben A (JIRA)

When you talk about inherited conformance, are you referring to the possibility of a subclass overriding a method required by the protocol being conformed to? TBH, I'm still unpacking "inherited conformance" and its implications in my head.

@huonw
Copy link
Mannequin

huonw mannequin commented Apr 24, 2018

A subclass S automatically conforms to all the same protocols P that base class B does, for substitutability (i.e. any value of S should be able to used as a B, even if passed to functions like func generic<T: P>(_: T)).

The compiler currently models three sorts of conformances as (separate) concrete objects in https://github.com/apple/swift/blob/master/include/swift/AST/ProtocolConformance.h : normal conformances (which is the main conformance, at the point it is originally declared, e.g. ModelFactory : CustomDebugStringConvertible), specialised conformances (which has types substituted into the main conformance, e.g. ModelFactory<Int> : CustomDebugStringConvertible, having substituted in the Int), and inherited conformances (for subclasses, e.g. the currently implied MockModelFactory : CustomDebugStringConvertible). I think Jordan is talking about those internal data structures when he says "inherited conformance".

@swift-ci
Copy link
Collaborator Author

Comment by Ben A (JIRA)

Got it. Thanks for the detailed explanation!

@belkadan
Copy link
Contributor

Looks like we fixed this somewhere along the way to Xcode 10. Ben, is it still reproducing for you?

@belkadan
Copy link
Contributor

Oops, sorry, I was testing the master branch, not the actual Xcode 10 compiler. And I know we reworked a bunch of things there.

@belkadan
Copy link
Contributor

Took a stab at this in #17406

@belkadan
Copy link
Contributor

Alternate simpler approach in #17523 I also included Huon's reduced test case for master in #17524

@swift-ci
Copy link
Collaborator Author

Comment by Ben A (JIRA)

Awesome. Thanks Jordan!

@AnnaZaks
Copy link
Mannequin

AnnaZaks mannequin commented Jul 26, 2018

benasher44 (JIRA User), Could you verify if the problem is fixed and if so move the JIRA to "Closed"?
Thanks!
Anna

@swift-ci
Copy link
Collaborator Author

Comment by Ben A (JIRA)

Will do! Out of town now, but I can verify next week.

@swift-ci
Copy link
Collaborator Author

Comment by Ben A (JIRA)

Verified as fixed in Xcode 10b5!

@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
This issue was closed.
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 crash Bug: A crash, i.e., an abnormal termination of software serialization Area → compiler: Serialization & deserialization
Projects
None yet
Development

No branches or pull requests

3 participants