Hi, I've recently encountered an interesting crash in the compiler. This crash happens in both Swift 5.2 and Swift 5.3. I've submitted a bug report to Apple, but I'm genuinely curious at what is going on here, and am wondering if someone on the forums might have some insight. The test case is pretty concise, and it is interesting that the crash can be "fixed" by either removing a generic argument, explicitly specifying an opaque return type, or removing a property of a generic type.
To verify, you can simply swiftc <illegal-instruction.swift>
if "illegal-instruction.swift" has the following contents:
protocol ContentProtocol { }
extension String: ContentProtocol { }
struct ContentContainer: ContentContainerProtocol {
var content: Content
/// Making the return type explicitly `String` fixes the crash
static func content() -> some ContentProtocol { "Content" }
}
protocol ContentContainerProtocol {
associatedtype Content
static func content() -> Content
}
// Removing `<Controller>` fixes the crash
struct Search<Controller>: Command {
var context: CommandContext<Self>
typealias Response = ContentContainer
}
protocol Command {
associatedtype Response
var context: CommandContext<Self> { get set }
}
typealias OuterCommand = Command
struct CommandContext<Command: OuterCommand> {
/// Removing this property fixes the crash
var response: Command.Response
}
Stack dump:
0. Program arguments: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -frontend -c -primary-file illegal-instruction.swift -target x86_64-apple-darwin19.5.0 -enable-objc-interop -stack-check -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -module-name main -o /var/folders/jg/_hvbx1hd6psf7vh9g_ytrrcw0000gn/T/illegal-instruction-cb0dba.o
1. Apple Swift version 5.2.4 (swiftlang-1103.0.32.9 clang-1103.0.32.53)
2. While emitting SIL for getter for context (at illegal-instruction.swift:18:7)
3. While silgen emitFunction SIL function "@$s4main6SearchV7contextAA14CommandContextVyACyxGGvg".
for getter for context (at illegal-instruction.swift:18:7)
0 swift 0x00000001072b14ea PrintStackTraceSignalHandler(void*) + 42
1 swift 0x00000001072b0cc0 SignalHandler(int) + 352
2 libsystem_platform.dylib 0x00007fff6b3005fd _sigtramp + 29
3 libsystem_platform.dylib 000000000000000000 _sigtramp + 2496657952
4 swift 0x00000001034fdacd (anonymous namespace)::EmitBBArguments::visitType(swift::CanType, bool) + 621
5 swift 0x00000001034fddce swift::CanTypeVisitor<(anonymous namespace)::EmitBBArguments, swift::Lowering::ManagedValue>::visit(swift::CanType) + 62
6 swift 0x00000001034fd321 (anonymous namespace)::ArgumentInitHelper::emitParam(swift::ParamDecl*) + 545
7 swift 0x00000001034fc97a swift::Lowering::SILGenFunction::emitProlog(swift::ParameterList*, swift::ParamDecl*, swift::Type, swift::DeclContext*, bool, swift::SourceLoc) + 490
8 swift 0x00000001034fb294 swift::Lowering::SILGenFunction::emitProlog(swift::CaptureInfo, swift::ParameterList*, swift::ParamDecl*, swift::DeclContext*, swift::Type, bool, swift::SourceLoc) + 68
9 swift 0x00000001034b15a3 swift::Lowering::SILGenFunction::emitFunction(swift::FuncDecl*) + 323
10 swift 0x0000000103417959 swift::Lowering::SILGenModule::emitFunction(swift::FuncDecl*) + 953
11 swift 0x00000001035131b8 void llvm::function_ref<void (swift::AccessorDecl*)>::callback_fn<(anonymous namespace)::SILGenType::visitAccessors(swift::AbstractStorageDecl*)::'lambda'(swift::AccessorDecl*)>(long, swift::AccessorDecl*) + 24
12 swift 0x000000010401ddf2 swift::AbstractStorageDecl::visitExpectedOpaqueAccessors(llvm::function_ref<void (swift::AccessorKind)>) const + 322
13 swift 0x0000000103513166 (anonymous namespace)::SILGenType::visitVarDecl(swift::VarDecl*) + 2022
14 swift 0x000000010350fcdb (anonymous namespace)::SILGenType::emitType() + 1163
15 swift 0x0000000103421d82 swift::ASTVisitor<swift::Lowering::SILGenModule, void, void, void, void, void, void>::visit(swift::Decl*) + 82
16 swift 0x0000000103420f4c swift::Lowering::SILGenModule::emitSourceFile(swift::SourceFile*) + 1356
17 swift 0x0000000103422fce swift::SILModule::constructSIL(swift::ModuleDecl*, swift::Lowering::TypeConverter&, swift::SILOptions&, swift::FileUnit*) + 1438
18 swift 0x0000000103002d51 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 48065
19 swift 0x0000000102f7ab73 main + 1283
20 libdyld.dylib 0x00007fff6b107cc9 start + 1
<unknown>:0: error: unable to execute command: Illegal instruction: 4
<unknown>:0: error: compile command failed due to signal 4 (use -v to see invocation)