Build error using case switch of tuple of optionals

I'm getting segfault when attempting to build the following code:

func f(_ list: [Int], _ predicates: [(Int) -> Bool]) -> ([Int], [Int])? {
    switch (list.first, predicates.first) {
    case (nil, _): return nil
    case (_, nil): return ([], list)
    case let (.some(first), .some(predicate)):
        guard predicate(first) else { return nil }
        return ([first], Array(list.dropFirst()))
    }
}

Assuming this issue is not known, where should I file a bug?


Some additional information:

  • Swift Version:
$ swift --version
Apple Swift version 4.2.1 (swiftlang-1000.11.42 clang-1000.11.45.1)
Target: x86_64-apple-darwin18.0.0
  • Stack trace:
Compile Swift Module 'segfault' (1 sources)
0  swift                    0x000000010e74759a PrintStackTraceSignalHandler(void*) + 42
1  swift                    0x000000010e746d4e SignalHandler(int) + 302
2  libsystem_platform.dylib 0x00007fff5e03eb3d _sigtramp + 29
3  libsystem_platform.dylib 0x000000010fd25a00 _sigtramp + 2983096032
4  swift                    0x000000010bf42769 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                    0x000000010bf427d8 swift::Type::transformRec(llvm::function_ref<llvm::Optional<swift::Type> (swift::TypeBase*)>) const + 56
6  swift                    0x000000010ac0b83c swift::irgen::IRGenFunction::emitTypeMetadataRef(swift::CanType, swift::irgen::DynamicMetadataRequest) + 76
7  swift                    0x000000010ac0b5d2 (anonymous namespace)::EmitTypeMetadataRef::visitAnyMetatypeType(swift::CanTypeWrapper<swift::AnyMetatypeType>, swift::irgen::DynamicMetadataRequest) + 130
8  swift                    0x000000010ac07fb3 emitDirectTypeMetadataRef(swift::irgen::IRGenFunction&, swift::CanType, swift::irgen::DynamicMetadataRequest) + 339
9  swift                    0x000000010ac07e44 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                    0x000000010ac07c39 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                    0x000000010ac06210 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                    0x000000010ac07bca 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                    0x000000010ac0ba32 emitCallToTypeMetadataAccessFunction(swift::irgen::IRGenFunction&, swift::CanType, swift::irgen::DynamicMetadataRequest, swift::ForDefinition_t) + 114
14 swift                    0x000000010ac0b8c3 swift::irgen::IRGenFunction::emitTypeMetadataRef(swift::CanType, swift::irgen::DynamicMetadataRequest) + 211
15 swift                    0x000000010ac0bd13 void llvm::function_ref<void (unsigned int, swift::CanType, llvm::Optional<swift::ProtocolConformanceRef>)>::callback_fn<(anonymous namespace)::GenericArguments::collect(swift::irgen::IRGenFunction&, swift::CanType)::'lambda'(unsigned int, swift::CanType, llvm::Optional<swift::ProtocolConformanceRef>)>(long, unsigned int, swift::CanType, llvm::Optional<swift::ProtocolConformanceRef>) + 147
16 swift                    0x000000010ab5bbbe swift::irgen::GenericTypeRequirements::enumerateFulfillments(swift::irgen::IRGenModule&, swift::SubstitutionMap const&, llvm::function_ref<void (unsigned int, swift::CanType, llvm::Optional<swift::ProtocolConformanceRef>)>) + 398
17 swift                    0x000000010ac0a820 emitNominalMetadataRef(swift::irgen::IRGenFunction&, swift::NominalTypeDecl*, swift::CanType, swift::irgen::DynamicMetadataRequest) + 400
18 swift                    0x000000010ac07ed8 emitDirectTypeMetadataRef(swift::irgen::IRGenFunction&, swift::CanType, swift::irgen::DynamicMetadataRequest) + 120
19 swift                    0x000000010ac07e44 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
20 swift                    0x000000010ac07c39 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
21 swift                    0x000000010ac06210 swift::irgen::emitLazyCacheAccessFunction(swift::irgen::IRGenModule&, llvm::Function*, llvm::GlobalVariable*, llvm::function_ref<swift::irgen::MetadataResponse (swift::irgen::IRGenFunction&, swift::irgen::Explosion&)>, bool) + 1504
22 swift                    0x000000010ac07bca 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
23 swift                    0x000000010ac0ba32 emitCallToTypeMetadataAccessFunction(swift::irgen::IRGenFunction&, swift::CanType, swift::irgen::DynamicMetadataRequest, swift::ForDefinition_t) + 114
24 swift                    0x000000010ac0b8c3 swift::irgen::IRGenFunction::emitTypeMetadataRef(swift::CanType, swift::irgen::DynamicMetadataRequest) + 211
25 swift                    0x000000010ac0974b swift::irgen::MetadataResponse llvm::function_ref<swift::irgen::MetadataResponse (swift::CanType, swift::irgen::DynamicMetadataRequest)>::callback_fn<(anonymous namespace)::EmitTypeMetadataRef::visitTupleType(swift::CanTypeWrapper<swift::TupleType>, swift::irgen::DynamicMetadataRequest)::'lambda'(swift::CanType, swift::irgen::DynamicMetadataRequest)>(long, swift::CanType, swift::irgen::DynamicMetadataRequest) + 59
26 swift                    0x000000010ac09d8b emitTupleTypeMetadataRef(swift::irgen::IRGenFunction&, swift::CanTypeWrapper<swift::TupleType>, swift::irgen::DynamicMetadataRequest, bool, llvm::function_ref<swift::irgen::MetadataResponse (swift::CanType, swift::irgen::DynamicMetadataRequest)>) + 1579
27 swift                    0x000000010ac080ef emitDirectTypeMetadataRef(swift::irgen::IRGenFunction&, swift::CanType, swift::irgen::DynamicMetadataRequest) + 655
28 swift                    0x000000010ac07e44 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
29 swift                    0x000000010ac07c39 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
30 swift                    0x000000010ac06210 swift::irgen::emitLazyCacheAccessFunction(swift::irgen::IRGenModule&, llvm::Function*, llvm::GlobalVariable*, llvm::function_ref<swift::irgen::MetadataResponse (swift::irgen::IRGenFunction&, swift::irgen::Explosion&)>, bool) + 1504
31 swift                    0x000000010ac07bca 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
32 swift                    0x000000010ac0ba32 emitCallToTypeMetadataAccessFunction(swift::irgen::IRGenFunction&, swift::CanType, swift::irgen::DynamicMetadataRequest, swift::ForDefinition_t) + 114
33 swift                    0x000000010ac0b8c3 swift::irgen::IRGenFunction::emitTypeMetadataRef(swift::CanType, swift::irgen::DynamicMetadataRequest) + 211
34 swift                    0x000000010ac0e956 swift::irgen::emitMetatypeRef(swift::irgen::IRGenFunction&, swift::CanTypeWrapper<swift::MetatypeType>, swift::irgen::Explosion&) + 102
35 swift                    0x000000010abc40de swift::SILInstructionVisitor<(anonymous namespace)::IRGenSILFunction, void>::visit(swift::SILInstruction*) + 38958
36 swift                    0x000000010abb7d41 swift::irgen::IRGenModule::emitSILFunction(swift::SILFunction*) + 9825
37 swift                    0x000000010aa99910 swift::irgen::IRGenerator::emitGlobalTopLevel(bool) + 1184
38 swift                    0x000000010ab98386 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) + 1382
39 swift                    0x000000010a9d8980 performCompile(swift::CompilerInstance&, swift::CompilerInvocation&, llvm::ArrayRef<char const*>, int&, swift::FrontendObserver*, swift::UnifiedStatsReporter*) + 46928
40 swift                    0x000000010a9c9d35 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 7717
41 swift                    0x000000010a96f965 main + 1349
42 libdyld.dylib            0x00007fff5de55085 start + 1
43 libdyld.dylib            0x0000000000000026 start + 2719657890
Stack dump:
0.	Program arguments: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -frontend -c -primary-file /Users/Owner1/workspace/swift/segfault/Sources/segfault/segfault.swift -emit-module-path /Users/Owner1/workspace/swift/segfault/.build/x86_64-apple-macosx10.10/debug/segfault.build/segfault~partial.swiftmodule -emit-module-doc-path /Users/Owner1/workspace/swift/segfault/.build/x86_64-apple-macosx10.10/debug/segfault.build/segfault~partial.swiftdoc -emit-dependencies-path /Users/Owner1/workspace/swift/segfault/.build/x86_64-apple-macosx10.10/debug/segfault.build/segfault.d -emit-reference-dependencies-path /Users/Owner1/workspace/swift/segfault/.build/x86_64-apple-macosx10.10/debug/segfault.build/segfault.swiftdeps -target x86_64-apple-macosx10.10 -enable-objc-interop -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk -I /Users/Owner1/workspace/swift/segfault/.build/x86_64-apple-macosx10.10/debug -F /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks -enable-testing -g -module-cache-path /Users/Owner1/workspace/swift/segfault/.build/x86_64-apple-macosx10.10/debug/ModuleCache -swift-version 4.2 -Onone -D SWIFT_PACKAGE -D DEBUG -parse-as-library -module-name segfault -o /Users/Owner1/workspace/swift/segfault/.build/x86_64-apple-macosx10.10/debug/segfault.build/segfault.swift.o 
1.	While emitting IR SIL function "@$S8segfault1fySaySiG_ACtSgAC_SaySbSicGtF".
 for 'f(_:_:)' at /Users/Owner1/workspace/swift/segfault/Sources/segfault/segfault.swift:1:1
<unknown>:0: error: unable to execute command: Segmentation fault: 11
<unknown>:0: error: compile command failed due to signal 11 (use -v to see invocation)

Also, here are some workarounds in case (pun intended) anyone was interested:

func f(_ list: [Int], _ predicates: [(Int) -> Bool]) -> ([Int], [Int])? {
    switch (list.first, predicates.first) {
    case (nil, _): return nil
    case (_, nil): return ([], list)
    default:
        let first = list.first!
        let predicate = predicates.first!
        guard predicate(first) else { return nil }
        return ([first], Array(list.dropFirst()))
    }
}

and

func f(_ list: [Int], _ predicates: [(Int) -> Bool]) -> ([Int], [Int])? {
    guard let x = list.first else { return nil }
    guard let p = predicates.first else { return ([], list) }
    guard p(x) else { return nil }

    return ([x], Array(list.dropFirst()))
}

The compiler should never segfault whether or not the code is well-formed. It might be that this is already addressed in Swift 5, but it’s not wrong to file a bug at bugs.swift.org and you should never feel like you shouldn’t report such a finding. If it’s a duplicate, it’ll be triaged as such, no big deal.

2 Likes

Thanks.

For anyone interested in the results, [SR-9952] Build error using case switch of tuple of optionals · Issue #52355 · apple/swift · GitHub