swiftlang / swift

The Swift Programming Language
https://swift.org
Apache License 2.0
67.3k stars 10.34k forks source link

[SR-4427] Segfault referencing @compatibility_alias to lightweight generic class #47004

Open 1ec5 opened 7 years ago

1ec5 commented 7 years ago
Previous ID SR-4427
Radar None
Original Reporter @1ec5
Type Bug
Environment Apple Swift version 3.1 (swiftlang-802.0.48 clang-802.0.38) Target: x86_64-apple-macosx10.9
Additional Detail from JIRA | | | |------------------|-----------------| |Votes | 0 | |Component/s | Compiler | |Labels | Bug, ClangImporter, CompilerCrash | |Assignee | None | |Priority | Medium | md5: 7957eccbc827156c9c704b0311e1268e

Issue Description:

Any reference to an Objective-C @compatibility_alias of a class that uses lightweight generics causes the compiler to segfault in Swift 3.1 but not in Swift 3.0. The crash only reproduces if the actual class has a lightweight generics parameter.

To reproduce this bug, declare the following class and compatibility alias in an Objective-C header:

@interface RenamedGenericClass<T> : NSObject

@end

@compatibility_alias OriginalGenericClass RenamedGenericClass;

Then refer to it anywhere in a Swift file:

let originalGeneric = OriginalGenericClass<NSObject>()

The compiler crashes with the following crash trace:

0  swift                    0x00000001089d0eb7 PrintStackTraceSignalHandler(void*) + 39
1  swift                    0x00000001089d0366 SignalHandler(int) + 646
2  libsystem_platform.dylib 0x00007fffaf648bba _sigtramp + 26
3  libsystem_platform.dylib 0x00007fff5a483a90 _sigtramp + 2867048176
4  swift                    0x0000000106820cde swift::NominalTypeDecl::hasFixedLayout() const + 14
5  swift                    0x00000001064224d2 (anonymous namespace)::LowerType::visitAnyStructType(swift::CanType, swift::StructDecl*) + 50
6  swift                    0x0000000106421adc swift::Lowering::TypeConverter::getTypeLoweringForUncachedLoweredType(swift::Lowering::TypeConverter::TypeKey) + 76
7  swift                    0x0000000106421318 swift::Lowering::TypeConverter::getTypeLowering(swift::Lowering::AbstractionPattern, swift::Type, unsigned int) + 2328
8  swift                    0x00000001060527a0 swift::Lowering::SILGenModule::getSILGlobalVariable(swift::VarDecl*, swift::ForDefinition_t) + 1888
9  swift                    0x000000010601d95d swift::Lowering::SILGenFunction::emitInitializationForVarDecl(swift::VarDecl*) + 573
10 swift                    0x000000010601fae3 swift::Lowering::SILGenFunction::emitPatternBinding(swift::PatternBindingDecl*, unsigned int) + 83
11 swift                    0x0000000106053b25 swift::Lowering::SILGenFunction::emitLazyGlobalInitializer(swift::PatternBindingDecl*, unsigned int) + 101
12 swift                    0x0000000105fd86cc swift::Lowering::SILGenModule::emitLazyGlobalInitializer(llvm::StringRef, swift::PatternBindingDecl*, unsigned int) + 1196
13 swift                    0x0000000106053786 swift::Lowering::SILGenModule::emitGlobalInitialization(swift::PatternBindingDecl*, unsigned int) + 2246
14 swift                    0x0000000105fdd0bf swift::ASTVisitor<swift::Lowering::SILGenModule, void, void, void, void, void, void>::visit(swift::Decl*) + 207
15 swift                    0x0000000105fdc33b swift::Lowering::SILGenModule::emitSourceFile(swift::SourceFile*, unsigned int) + 1483
16 swift                    0x0000000105fddf19 swift::SILModule::constructSIL(swift::ModuleDecl*, swift::SILOptions&, swift::FileUnit*, llvm::Optional<unsigned int>, bool, bool) + 1593
17 swift                    0x00000001057f00b2 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 42402
18 swift                    0x000000010579f88c main + 9052
19 libdyld.dylib            0x00007fffaf43b255 start + 1
Stack dump:
0.  Program arguments: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -frontend -c -primary-file /Users/mxn/Desktop/EightyFiveHundredSixtySeven/EightyFiveHundredSixtySeven/File.swift -target x86_64-apple-macosx10.12 -enable-objc-interop -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk -I /Users/mxn/Library/Developer/Xcode/DerivedData/EightyFiveHundredSixtySeven-bhuxvmxvynjivlelrsrdbojwhqfl/Build/Products/Debug -F /Users/mxn/Library/Developer/Xcode/DerivedData/EightyFiveHundredSixtySeven-bhuxvmxvynjivlelrsrdbojwhqfl/Build/Products/Debug -enable-testing -g -module-cache-path /Users/mxn/Library/Developer/Xcode/DerivedData/ModuleCache -serialize-debugging-options -Xcc -I/Users/mxn/Library/Developer/Xcode/DerivedData/EightyFiveHundredSixtySeven-bhuxvmxvynjivlelrsrdbojwhqfl/Build/Intermediates/EightyFiveHundredSixtySeven.build/Debug/EightyFiveHundredSixtySeven.build/swift-overrides.hmap -Xcc -iquote -Xcc /Users/mxn/Library/Developer/Xcode/DerivedData/EightyFiveHundredSixtySeven-bhuxvmxvynjivlelrsrdbojwhqfl/Build/Intermediates/EightyFiveHundredSixtySeven.build/Debug/EightyFiveHundredSixtySeven.build/EightyFiveHundredSixtySeven-generated-files.hmap -Xcc -I/Users/mxn/Library/Developer/Xcode/DerivedData/EightyFiveHundredSixtySeven-bhuxvmxvynjivlelrsrdbojwhqfl/Build/Intermediates/EightyFiveHundredSixtySeven.build/Debug/EightyFiveHundredSixtySeven.build/EightyFiveHundredSixtySeven-own-target-headers.hmap -Xcc -I/Users/mxn/Library/Developer/Xcode/DerivedData/EightyFiveHundredSixtySeven-bhuxvmxvynjivlelrsrdbojwhqfl/Build/Intermediates/EightyFiveHundredSixtySeven.build/Debug/EightyFiveHundredSixtySeven.build/EightyFiveHundredSixtySeven-all-target-headers.hmap -Xcc -iquote -Xcc /Users/mxn/Library/Developer/Xcode/DerivedData/EightyFiveHundredSixtySeven-bhuxvmxvynjivlelrsrdbojwhqfl/Build/Intermediates/EightyFiveHundredSixtySeven.build/Debug/EightyFiveHundredSixtySeven.build/EightyFiveHundredSixtySeven-project-headers.hmap -Xcc -I/Users/mxn/Library/Developer/Xcode/DerivedData/EightyFiveHundredSixtySeven-bhuxvmxvynjivlelrsrdbojwhqfl/Build/Products/Debug/include -Xcc -I/Users/mxn/Library/Developer/Xcode/DerivedData/EightyFiveHundredSixtySeven-bhuxvmxvynjivlelrsrdbojwhqfl/Build/Intermediates/EightyFiveHundredSixtySeven.build/Debug/EightyFiveHundredSixtySeven.build/DerivedSources/x86_64 -Xcc -I/Users/mxn/Library/Developer/Xcode/DerivedData/EightyFiveHundredSixtySeven-bhuxvmxvynjivlelrsrdbojwhqfl/Build/Intermediates/EightyFiveHundredSixtySeven.build/Debug/EightyFiveHundredSixtySeven.build/DerivedSources -Xcc -DDEBUG=1 -Xcc -working-directory/Users/mxn/Desktop/EightyFiveHundredSixtySeven -emit-module-doc-path /Users/mxn/Library/Developer/Xcode/DerivedData/EightyFiveHundredSixtySeven-bhuxvmxvynjivlelrsrdbojwhqfl/Build/Intermediates/EightyFiveHundredSixtySeven.build/Debug/EightyFiveHundredSixtySeven.build/Objects-normal/x86_64/File~partial.swiftdoc -serialize-diagnostics-path /Users/mxn/Library/Developer/Xcode/DerivedData/EightyFiveHundredSixtySeven-bhuxvmxvynjivlelrsrdbojwhqfl/Build/Intermediates/EightyFiveHundredSixtySeven.build/Debug/EightyFiveHundredSixtySeven.build/Objects-normal/x86_64/File.dia -import-objc-header /Users/mxn/Desktop/EightyFiveHundredSixtySeven/EightyFiveHundredSixtySeven/EightyFiveHundredSixtySeven-Bridging-Header.h -Onone -parse-as-library -module-name EightyFiveHundredSixtySeven -emit-module-path /Users/mxn/Library/Developer/Xcode/DerivedData/EightyFiveHundredSixtySeven-bhuxvmxvynjivlelrsrdbojwhqfl/Build/Intermediates/EightyFiveHundredSixtySeven.build/Debug/EightyFiveHundredSixtySeven.build/Objects-normal/x86_64/File~partial.swiftmodule -emit-dependencies-path /Users/mxn/Library/Developer/Xcode/DerivedData/EightyFiveHundredSixtySeven-bhuxvmxvynjivlelrsrdbojwhqfl/Build/Intermediates/EightyFiveHundredSixtySeven.build/Debug/EightyFiveHundredSixtySeven.build/Objects-normal/x86_64/File.d -emit-reference-dependencies-path /Users/mxn/Library/Developer/Xcode/DerivedData/EightyFiveHundredSixtySeven-bhuxvmxvynjivlelrsrdbojwhqfl/Build/Intermediates/EightyFiveHundredSixtySeven.build/Debug/EightyFiveHundredSixtySeven.build/Objects-normal/x86_64/File.swiftdeps -o /Users/mxn/Library/Developer/Xcode/DerivedData/EightyFiveHundredSixtySeven-bhuxvmxvynjivlelrsrdbojwhqfl/Build/Intermediates/EightyFiveHundredSixtySeven.build/Debug/EightyFiveHundredSixtySeven.build/Objects-normal/x86_64/File.o

This issue was originally reported in the Mapbox GL Native project. The Mapbox iOS and macOS SDKs define a couple compatibility aliases, but only the alias to a class using lightweight generics is affected.

belkadan commented 7 years ago

Ooh, good catch. @slavapestov, think this is easy enough to be a starter bug? (The original @compatibility_alias support was a starter bug.)

slavapestov commented 7 years ago

Yeah. The ClangImporter already has some code to cook up generic type aliases for renamed things, it should be easy to generalize. Constructing generic things by hand is still rather tedious but there are enough examples to look at that it might be a good learning experience.