swiftlang / swift

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

Crash using switch expression incorrectly #74476

Closed mac-cain13 closed 4 weeks ago

mac-cain13 commented 4 weeks ago

Description

While writing some code in my project the Swift compiler suddenly started crashing. A clean compile showed me the "Please submit a bug report" message pointing to an (incorrect) switch expression, so here I am filing the bug report. :)

Reproduction

class InputRecorder {
    private var eventMonitor: Task<Void, Never>?
    // ...

    func setup() async throws {
        eventMonitor = Task { [captureMode] in
            let cgEventStream = switch captureMode {
                        case .mouseEvents:
                            CGEvent.combinedMonitorForEvents(matching: mouseEventsTypeMask)
                        case .keyboardEvents, .mouseAndKeyboardEvents:
                            let eventTypes = captureMode.eventTypes.union(tapDisabledTypes)
                            let eventMask = CGEventMask(types: eventTypes)
                            return CGEvent.eventTapForEvents(matching: eventMask) // This return is wrong
                        }
            // ...
        }
    }

    // ...
}

Stack dump

Stack dump:
0.  Program arguments: /Applications/Xcode-15.4.0.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-frontend -frontend -c [swift input files redacted] -supplementary-output-file-map /Users/[redacted]/Library/Developer/Xcode/DerivedData/RecordKitMacOSDebug-clpcppcbndvipzcsblwmzuajzzph/Build/Intermediates.noindex/RecordKit.build/Debug/RecordKit.build/Objects-normal/arm64/supplementaryOutputs-3181 -target arm64-apple-macos13.0 -Xllvm -aarch64-use-tbi -enable-objc-interop -stack-check -sdk /Applications/Xcode-15.4.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.5.sdk -I /Users/[redacted]/Library/Developer/Xcode/DerivedData/RecordKitMacOSDebug-clpcppcbndvipzcsblwmzuajzzph/Build/Products/Debug -I /Applications/Xcode-15.4.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/lib -F /Users/[redacted]/Library/Developer/Xcode/DerivedData/RecordKitMacOSDebug-clpcppcbndvipzcsblwmzuajzzph/Build/Products/Debug/PackageFrameworks -F /Users/[redacted]/Library/Developer/Xcode/DerivedData/RecordKitMacOSDebug-clpcppcbndvipzcsblwmzuajzzph/Build/Products/Debug -F /Applications/Xcode-15.4.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks -no-color-diagnostics -enable-testing -g -module-cache-path /Users/[redacted]/Library/Developer/Xcode/DerivedData/ModuleCache.noindex -swift-version 5 -enforce-exclusivity=checked -Onone -D SWIFT_PACKAGE -D DEBUG -D Xcode -serialize-debugging-options -package-name recordkit_swift -const-gather-protocols-file /Users/[redacted]/Library/Developer/Xcode/DerivedData/RecordKitMacOSDebug-clpcppcbndvipzcsblwmzuajzzph/Build/Intermediates.noindex/RecordKit.build/Debug/RecordKit.build/Objects-normal/arm64/RecordKit_const_extract_protocols.json -empty-abi-descriptor -validate-clang-modules-once -clang-build-session-file /Users/[redacted]/Library/Developer/Xcode/DerivedData/ModuleCache.noindex/Session.modulevalidation -Xcc -working-directory -Xcc /Users/[redacted]/recordkit-swift -resource-dir /Applications/Xcode-15.4.0.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift -enable-anonymous-context-mangled-names -Xcc -fmodule-map-file=/Users/[redacted]/Library/Developer/Xcode/DerivedData/RecordKitMacOSDebug-clpcppcbndvipzcsblwmzuajzzph/Build/Intermediates.noindex/GeneratedModuleMaps/Interop.modulemap -Xcc -ivfsstatcache -Xcc /Users/[redacted]/Library/Developer/Xcode/DerivedData/SDKStatCaches.noindex/macosx14.5-23F73-49faecbf30425c10d630e79548f1fbc6.sdkstatcache -Xcc -I/Users/[redacted]/Library/Developer/Xcode/DerivedData/RecordKitMacOSDebug-clpcppcbndvipzcsblwmzuajzzph/Build/Intermediates.noindex/RecordKit.build/Debug/RecordKit.build/swift-overrides.hmap -Xcc -I/Users/[redacted]/recordkit-swift/Sources/Interop/include -Xcc -I/Users/[redacted]/Library/Developer/Xcode/DerivedData/RecordKitMacOSDebug-clpcppcbndvipzcsblwmzuajzzph/Build/Products/Debug/include -Xcc -I/Users/[redacted]/Library/Developer/Xcode/DerivedData/RecordKitMacOSDebug-clpcppcbndvipzcsblwmzuajzzph/Build/Intermediates.noindex/RecordKit.build/Debug/RecordKit.build/DerivedSources-normal/arm64 -Xcc -I/Users/[redacted]/Library/Developer/Xcode/DerivedData/RecordKitMacOSDebug-clpcppcbndvipzcsblwmzuajzzph/Build/Intermediates.noindex/RecordKit.build/Debug/RecordKit.build/DerivedSources/arm64 -Xcc -I/Users/[redacted]/Library/Developer/Xcode/DerivedData/RecordKitMacOSDebug-clpcppcbndvipzcsblwmzuajzzph/Build/Intermediates.noindex/RecordKit.build/Debug/RecordKit.build/DerivedSources -Xcc -DSWIFT_PACKAGE -Xcc -DDEBUG=1 -module-name RecordKit -frontend-parseable-output -disable-clang-spi -target-sdk-version 14.5 -target-sdk-name macosx14.5 -external-plugin-path /Applications/Xcode-15.4.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.5.sdk/usr/lib/swift/host/plugins#/Applications/Xcode-15.4.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.5.sdk/usr/bin/swift-plugin-server -external-plugin-path /Applications/Xcode-15.4.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.5.sdk/usr/local/lib/swift/host/plugins#/Applications/Xcode-15.4.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.5.sdk/usr/bin/swift-plugin-server -external-plugin-path /Applications/Xcode-15.4.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/lib/swift/host/plugins#/Applications/Xcode-15.4.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/bin/swift-plugin-server -external-plugin-path /Applications/Xcode-15.4.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/local/lib/swift/host/plugins#/Applications/Xcode-15.4.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/bin/swift-plugin-server -plugin-path /Applications/Xcode-15.4.0.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/host/plugins -plugin-path /Applications/Xcode-15.4.0.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/lib/swift/host/plugins -o [swift output files redacted] -index-unit-output-path /RecordKit.build/Debug/RecordKit.build/Objects-normal/arm64/MacModelSpecs.o -index-store-path /Users/[redacted]/Library/Developer/Xcode/DerivedData/RecordKitMacOSDebug-clpcppcbndvipzcsblwmzuajzzph/Index.noindex/DataStore -index-system-modules
1.  Apple Swift version 5.10 (swiftlang-5.10.0.13 clang-1500.3.9.4)
2.  Compiling with the current language version
3.  While evaluating request USRGenerationRequest(RecordKit.(file).InputRecorder.setup().explicit closure discriminator=0.cgEventStream@/Users/[redacted]/recordkit-swift/Sources/RecordKit/Internal/InputRecorder.swift:83:17)
4.  While evaluating request InterfaceTypeRequest(RecordKit.(file).InputRecorder.setup().explicit closure discriminator=0.cgEventStream@/Users/[redacted]/recordkit-swift/Sources/RecordKit/Internal/InputRecorder.swift:83:17)
5.  While evaluating request NamingPatternRequest(RecordKit.(file).InputRecorder.setup().explicit closure discriminator=0.cgEventStream@/Users/[redacted]/recordkit-swift/Sources/RecordKit/Internal/InputRecorder.swift:83:17)
6.  While evaluating request PatternBindingEntryRequest((unknown decl), 0, 0)
7.  While type-checking expression at [/Users/[redacted]/recordkit-swift/Sources/RecordKit/Internal/InputRecorder.swift:83:33 - line:90:13] RangeText="switch captureMode {
            case .mouseEvents:
                CGEvent.combinedMonitorForEvents(matching: mouseEventsTypeMask)
            case .keyboardEvents, .mouseAndKeyboardEvents:
                let eventTypes = captureMode.eventTypes.union(tapDisabledTypes)
                let eventMask = CGEventMask(types: eventTypes)
                return CGEvent.eventTapForEvents(matching: eventMask)
            "
8.  While type-checking-target starting at /Users/[redacted]/recordkit-swift/Sources/RecordKit/Internal/InputRecorder.swift:83:33
Stack dump without symbol names (ensure you have llvm-symbolizer in your PATH or set the environment var `LLVM_SYMBOLIZER_PATH` to point to it):
0  swift-frontend           0x00000001081f3f3c llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) + 56
1  swift-frontend           0x00000001081f30f8 llvm::sys::RunSignalHandlers() + 112
2  swift-frontend           0x00000001081f4544 SignalHandler(int) + 360
3  libsystem_platform.dylib 0x0000000181cb3584 _sigtramp + 56
4  swift-frontend           0x0000000104266b4c (anonymous namespace)::Traversal::visit(swift::Stmt*) + 436
5  swift-frontend           0x0000000104266b4c (anonymous namespace)::Traversal::visit(swift::Stmt*) + 436
6  swift-frontend           0x0000000104267520 (anonymous namespace)::Traversal::visit(swift::Stmt*) + 2952
7  swift-frontend           0x00000001041eac14 swift::ASTNode::walk(swift::ASTWalker&) + 252
8  swift-frontend           0x0000000103b9a9d0 (anonymous namespace)::createConjunction(swift::constraints::ConstraintSystem&, swift::DeclContext*, llvm::ArrayRef<std::__1::tuple<swift::ASTNode, swift::constraints::ContextualTypeInfo, bool, swift::constraints::ConstraintLocator*>>, swift::constraints::ConstraintLocator*, bool, llvm::ArrayRef<swift::TypeVariableType*>) + 1440
9  swift-frontend           0x0000000103b995b8 swift::ASTVisitor<(anonymous namespace)::SyntacticElementConstraintGenerator, void, void, void, void, void, void>::visit(swift::Stmt*) + 7812
10 swift-frontend           0x0000000103b99edc swift::constraints::ConstraintSystem::generateConstraints(swift::SingleValueStmtExpr*) + 996
11 swift-frontend           0x0000000103bad79c (anonymous namespace)::ConstraintWalker::walkToExprPre(swift::Expr*) + 124
12 swift-frontend           0x0000000103ba8748 swift::constraints::ConstraintSystem::generateConstraints(swift::Expr*, swift::DeclContext*, bool) + 180
13 swift-frontend           0x0000000103ba807c swift::constraints::ConstraintSystem::generateConstraints(swift::constraints::SyntacticElementTarget&, swift::FreeTypeVariableBinding) + 1260
14 swift-frontend           0x0000000103c27750 swift::constraints::ConstraintSystem::solve(swift::constraints::SyntacticElementTarget&, swift::FreeTypeVariableBinding) + 932
15 swift-frontend           0x0000000103e13b48 swift::TypeChecker::typeCheckTarget(swift::constraints::SyntacticElementTarget&, swift::OptionSet<swift::TypeCheckExprFlags, unsigned int>) + 584
16 swift-frontend           0x0000000103e137dc swift::TypeChecker::typeCheckExpression(swift::constraints::SyntacticElementTarget&, swift::OptionSet<swift::TypeCheckExprFlags, unsigned int>) + 436
17 swift-frontend           0x0000000103e14da0 swift::TypeChecker::typeCheckBinding(swift::Pattern*&, swift::Expr*&, swift::DeclContext*, swift::Type, swift::PatternBindingDecl*, unsigned int, swift::OptionSet<swift::TypeCheckExprFlags, unsigned int>) + 124
18 swift-frontend           0x0000000103e14fdc swift::TypeChecker::typeCheckPatternBinding(swift::PatternBindingDecl*, unsigned int, swift::Type, swift::OptionSet<swift::TypeCheckExprFlags, unsigned int>) + 256
19 swift-frontend           0x0000000103f3115c swift::PatternBindingEntryRequest::evaluate(swift::Evaluator&, swift::PatternBindingDecl*, unsigned int, bool) const + 3852
20 swift-frontend           0x0000000103e3f25c llvm::Expected<swift::PatternBindingEntryRequest::OutputType> swift::Evaluator::getResultUncached<swift::PatternBindingEntryRequest>(swift::PatternBindingEntryRequest const&) + 648
21 swift-frontend           0x0000000103e2c388 swift::PatternBindingEntryRequest::OutputType swift::evaluateOrDefault<swift::PatternBindingEntryRequest>(swift::Evaluator&, swift::PatternBindingEntryRequest, swift::PatternBindingEntryRequest::OutputType) + 56
22 swift-frontend           0x0000000103e2bff8 swift::NamingPatternRequest::evaluate(swift::Evaluator&, swift::VarDecl*) const + 344
23 swift-frontend           0x00000001042f8c4c swift::NamingPatternRequest::OutputType swift::evaluateOrDefault<swift::NamingPatternRequest>(swift::Evaluator&, swift::NamingPatternRequest, swift::NamingPatternRequest::OutputType) + 1028
24 swift-frontend           0x0000000103e2b3f4 swift::InterfaceTypeRequest::evaluate(swift::Evaluator&, swift::ValueDecl*) const + 2920
25 swift-frontend           0x00000001042dd064 swift::InterfaceTypeRequest::OutputType swift::evaluateOrDefault<swift::InterfaceTypeRequest>(swift::Evaluator&, swift::InterfaceTypeRequest, swift::InterfaceTypeRequest::OutputType) + 1028
26 swift-frontend           0x00000001045439f8 swift::USRGenerationRequest::evaluate(swift::Evaluator&, swift::ValueDecl const*) const + 960
27 swift-frontend           0x0000000102c5e04c llvm::Expected<swift::USRGenerationRequest::OutputType> swift::Evaluator::getResultUncached<swift::USRGenerationRequest>(swift::USRGenerationRequest const&) + 656
28 swift-frontend           0x0000000102c5dc14 llvm::Expected<swift::USRGenerationRequest::OutputType> swift::Evaluator::getResultCached<swift::USRGenerationRequest, (void*)0>(swift::USRGenerationRequest const&) + 344
29 swift-frontend           0x0000000102c5ccb0 swift::USRGenerationRequest::OutputType swift::evaluateOrDefault<swift::USRGenerationRequest>(swift::Evaluator&, swift::USRGenerationRequest, swift::USRGenerationRequest::OutputType) + 48
30 swift-frontend           0x00000001045445dc swift::ide::printValueDeclUSR(swift::ValueDecl const*, llvm::raw_ostream&) + 140
31 swift-frontend           0x0000000102c20cc4 (anonymous namespace)::IndexSwiftASTWalker::getNameAndUSR(swift::ValueDecl*, swift::ExtensionDecl*, llvm::StringRef&, llvm::StringRef&) + 304
32 swift-frontend           0x0000000102c21620 (anonymous namespace)::IndexSwiftASTWalker::addRelation(swift::index::IndexSymbol&, unsigned int, swift::Decl*) + 228
33 swift-frontend           0x0000000102c20f48 (anonymous namespace)::IndexSwiftASTWalker::addContainedByRelationIfContained(swift::index::IndexSymbol&) + 236
34 swift-frontend           0x0000000102c200cc (anonymous namespace)::IndexSwiftASTWalker::initIndexSymbol(swift::ValueDecl*, swift::SourceLoc, bool, swift::index::IndexSymbol&) + 240
35 swift-frontend           0x0000000102c21cec (anonymous namespace)::IndexSwiftASTWalker::reportRef(swift::ValueDecl*, swift::SourceLoc, swift::index::IndexSymbol&, llvm::Optional<swift::AccessKind>) + 256
36 swift-frontend           0x0000000102c1f950 (anonymous namespace)::IndexSwiftASTWalker::visitDeclReference(swift::ValueDecl*, swift::CharSourceRange, swift::TypeDecl*, swift::ExtensionDecl*, swift::Type, swift::ReferenceMetaData) + 776
37 swift-frontend           0x0000000103813ab4 (anonymous namespace)::SemaAnnotator::passReference(swift::ValueDecl*, swift::Type, swift::SourceLoc, swift::SourceRange, swift::ReferenceMetaData) + 668
38 swift-frontend           0x0000000103813ca4 (anonymous namespace)::SemaAnnotator::passReference(swift::ValueDecl*, swift::Type, swift::DeclNameLoc, swift::ReferenceMetaData) + 348
39 swift-frontend           0x0000000103813538 (anonymous namespace)::SemaAnnotator::walkToTypeReprPre(swift::TypeRepr*) + 612
40 swift-frontend           0x00000001042617d4 (anonymous namespace)::Traversal::visitTypeExpr(swift::TypeExpr*) + 60
41 swift-frontend           0x0000000104261350 (anonymous namespace)::Traversal::visit(swift::Expr*) + 124
42 swift-frontend           0x0000000104261e78 (anonymous namespace)::Traversal::visitUnresolvedDotExpr(swift::UnresolvedDotExpr*) + 92
43 swift-frontend           0x0000000104261388 (anonymous namespace)::Traversal::visit(swift::Expr*) + 180
44 swift-frontend           0x00000001042664a4 (anonymous namespace)::Traversal::visitApplyExpr(swift::ApplyExpr*) + 92
45 swift-frontend           0x0000000104261320 (anonymous namespace)::Traversal::visit(swift::Expr*) + 76
46 swift-frontend           0x0000000104267160 (anonymous namespace)::Traversal::visit(swift::Stmt*) + 1992
47 swift-frontend           0x0000000104266b68 (anonymous namespace)::Traversal::visit(swift::Stmt*) + 464
48 swift-frontend           0x0000000104267520 (anonymous namespace)::Traversal::visit(swift::Stmt*) + 2952
49 swift-frontend           0x00000001042673d0 (anonymous namespace)::Traversal::visit(swift::Stmt*) + 2616
50 swift-frontend           0x0000000104265d58 (anonymous namespace)::Traversal::visitSingleValueStmtExpr(swift::SingleValueStmtExpr*) + 88
51 swift-frontend           0x00000001042615e0 (anonymous namespace)::Traversal::visit(swift::Expr*) + 780
52 swift-frontend           0x0000000104268d18 (anonymous namespace)::Traversal::visit(swift::Decl*) + 2604
53 swift-frontend           0x00000001042611f0 (anonymous namespace)::Traversal::doIt(swift::Decl*) + 312
54 swift-frontend           0x0000000104266a68 (anonymous namespace)::Traversal::visit(swift::Stmt*) + 208
55 swift-frontend           0x0000000104262c74 (anonymous namespace)::Traversal::visitClosureExpr(swift::ClosureExpr*) + 328
56 swift-frontend           0x000000010426140c (anonymous namespace)::Traversal::visit(swift::Expr*) + 312
57 swift-frontend           0x0000000104262ad4 (anonymous namespace)::Traversal::visitCaptureListExpr(swift::CaptureListExpr*) + 372
58 swift-frontend           0x0000000104261400 (anonymous namespace)::Traversal::visit(swift::Expr*) + 300
59 swift-frontend           0x0000000104269dbc (anonymous namespace)::Traversal::visit(swift::ArgumentList*) + 280
60 swift-frontend           0x0000000104266514 (anonymous namespace)::Traversal::visitApplyExpr(swift::ApplyExpr*) + 204
61 swift-frontend           0x0000000104261320 (anonymous namespace)::Traversal::visit(swift::Expr*) + 76
62 swift-frontend           0x0000000104260be8 swift::Expr::walk(swift::ASTWalker&) + 104
63 swift-frontend           0x0000000103812140 (anonymous namespace)::SemaAnnotator::walkToExprPre(swift::Expr*) + 2496
64 swift-frontend           0x0000000104266aec (anonymous namespace)::Traversal::visit(swift::Stmt*) + 340
65 swift-frontend           0x0000000104269a18 (anonymous namespace)::Traversal::visitAbstractFunctionDecl(swift::AbstractFunctionDecl*) + 740
66 swift-frontend           0x0000000104268370 (anonymous namespace)::Traversal::visit(swift::Decl*) + 132
67 swift-frontend           0x00000001042611f0 (anonymous namespace)::Traversal::doIt(swift::Decl*) + 312
68 swift-frontend           0x0000000104269418 (anonymous namespace)::Traversal::visitNominalTypeDecl(swift::NominalTypeDecl*) + 360
69 swift-frontend           0x0000000104268360 (anonymous namespace)::Traversal::visit(swift::Decl*) + 116
70 swift-frontend           0x00000001042611f0 (anonymous namespace)::Traversal::doIt(swift::Decl*) + 312
71 swift-frontend           0x0000000104418220 swift::SourceFile::walk(swift::ASTWalker&) + 304
72 swift-frontend           0x0000000103810e98 swift::SourceEntityWalker::walk(swift::SourceFile&) + 176
73 swift-frontend           0x0000000102c1cdf4 (anonymous namespace)::IndexSwiftASTWalker::visitModule(swift::ModuleDecl&) + 196
74 swift-frontend           0x0000000102c1cd04 swift::index::indexSourceFile(swift::SourceFile*, swift::index::IndexDataConsumer&) + 392
75 swift-frontend           0x0000000102c254c0 recordSourceFileUnit(swift::SourceFile*, llvm::StringRef, llvm::StringRef, bool, bool, bool, bool, bool, bool, llvm::StringRef, llvm::ArrayRef<clang::FileEntry const*>, clang::CompilerInstance const&, swift::PathRemapper const&, swift::DiagnosticEngine&) + 1504
76 swift-frontend           0x0000000102c24e58 swift::index::indexAndRecord(swift::SourceFile*, llvm::StringRef, llvm::StringRef, bool, bool, bool, bool, bool, bool, llvm::StringRef, swift::DependencyTracker const&, swift::PathRemapper const&) + 456
77 swift-frontend           0x0000000102afd1d4 emitIndexDataForSourceFile(swift::SourceFile*, swift::CompilerInstance const&) + 660
78 swift-frontend           0x0000000102afac44 performEndOfPipelineActions(swift::CompilerInstance&) + 8256
79 swift-frontend           0x0000000102af5f38 performCompile(swift::CompilerInstance&, int&, swift::FrontendObserver*) + 3660
80 swift-frontend           0x0000000102af36d0 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 4968
81 swift-frontend           0x0000000102a82e8c swift::mainEntry(int, char const**) + 2612
82 dyld                     0x00000001818fa0e0 start + 2360

Expected behavior

Error reporting that the return statement in the last case isn't allowed, since the switch is used as an expression.

Environment

❯ swiftc --version swift-driver version: 1.90.11.1 Apple Swift version 5.10 (swiftlang-5.10.0.13 clang-1500.3.9.4) Target: arm64-apple-macosx14.0

Also happens in Xcode 15.4 (15F31d).

Additional information

No response

hamishknight commented 4 weeks ago

This no longer crashes on main or 6.0, it was fixed by #71930