Skip to content

Swift compiler crash for enable / disable API on Linux platform #1006

@Kyle-Ye

Description

@Kyle-Ye

Description

For simple case, we can just use enabled(if:_) API and it works fine.

But if the Bool condition is complex, we'll use the closure based API of enabled(if:_).

And it will cause a compiler crash here on Linux platform.

swift test
Building for debugging...
error: emit-module command failed due to signal 11 (use -v to see invocation)
Please submit a bug report (https://swift.org/contributing/#reporting-bugs) and include the crash backtrace.
Stack dump:
0.	Program arguments: /home/kyle/.swiftbox/toolchain/swift-6.0.3/usr/bin/swift-frontend -frontend -emit-module -experimental-skip-non-inlinable-function-bodies-without-types /home/kyle/tmp/DemoKit/Tests/DemoKitTests/DemoKitTests.swift -target aarch64-unknown-linux-gnu -Xllvm -aarch64-use-tbi -disable-objc-interop -I /home/kyle/tmp/DemoKit/.build/aarch64-unknown-linux-gnu/debug/Modules -color-diagnostics -enable-testing -g -debug-info-format=dwarf -dwarf-version=4 -module-cache-path /home/kyle/tmp/DemoKit/.build/aarch64-unknown-linux-gnu/debug/ModuleCache -swift-version 6 -Onone -D SWIFT_PACKAGE -D DEBUG -empty-abi-descriptor -resource-dir /home/kyle/.swiftbox/toolchain/swift-6.0.3/usr/lib/swift -enable-anonymous-context-mangled-names -file-compilation-dir /home/kyle/tmp/DemoKit -Xcc -fPIC -Xcc -g -Xcc -fno-omit-frame-pointer -module-name DemoKitTests -package-name demokit -plugin-path /home/kyle/.swiftbox/toolchain/swift-6.0.3/usr/lib/swift/host/plugins -plugin-path /home/kyle/.swiftbox/toolchain/swift-6.0.3/usr/local/lib/swift/host/plugins -emit-module-doc-path /home/kyle/tmp/DemoKit/.build/aarch64-unknown-linux-gnu/debug/Modules/DemoKitTests.swiftdoc -emit-module-source-info-path /home/kyle/tmp/DemoKit/.build/aarch64-unknown-linux-gnu/debug/Modules/DemoKitTests.swiftsourceinfo -emit-dependencies-path /home/kyle/tmp/DemoKit/.build/aarch64-unknown-linux-gnu/debug/DemoKitTests.build/DemoKitTests.emit-module.d -parse-as-library -o /home/kyle/tmp/DemoKit/.build/aarch64-unknown-linux-gnu/debug/Modules/DemoKitTests.swiftmodule
1.	Swift version 6.0.3 (swift-6.0.3-RELEASE)
2.	Compiling with the current language version
3.	While evaluating request TypeCheckSourceFileRequest(source_file "/home/kyle/tmp/DemoKit/Tests/DemoKitTests/DemoKitTests.swift")
4.	While evaluating request ExpandPeerMacroRequest(DemoKitTests.(file).example2()@/home/kyle/tmp/DemoKit/Tests/DemoKitTests/DemoKitTests.swift:5:6)
5.	While evaluating request ResolveMacroRequest(custom-attr, 0xaaaaf5ce9598 FileUnit file="/home/kyle/tmp/DemoKit/Tests/DemoKitTests/DemoKitTests.swift")
6.	While type-checking expression at [/home/kyle/tmp/DemoKit/Tests/DemoKitTests/DemoKitTests.swift:4:1 - line:4:33] RangeText="@Test(.enabled { Bool.random() }"
7.	While type-checking-target starting at /home/kyle/tmp/DemoKit/Tests/DemoKitTests/DemoKitTests.swift:4:1
8.	While evaluating request FragileFunctionKindRequest(0xaaaaf5d7c9d8 AbstractClosureExpr line=4 : @Sendable () async -> Bool)
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  0x0000aaaad87dd4e0
1  swift-frontend  0x0000aaaad87db6c0
2  swift-frontend  0x0000aaaad87ddbec
3  linux-vdso.so.1 0x0000ffffa5110868 __kernel_rt_sigreturn + 0
4  swift-frontend  0x0000aaaad4844188
5  swift-frontend  0x0000aaaad48fb524
6  swift-frontend  0x0000aaaad48fe1d4
7  swift-frontend  0x0000aaaad48fe078
8  swift-frontend  0x0000aaaad48fb220
9  swift-frontend  0x0000aaaad430dfd0
10 swift-frontend  0x0000aaaad4319160
11 swift-frontend  0x0000aaaad47ef374
12 swift-frontend  0x0000aaaad47ece88
13 swift-frontend  0x0000aaaad47ec2cc
14 swift-frontend  0x0000aaaad43195c4
15 swift-frontend  0x0000aaaad47f4ba4
16 swift-frontend  0x0000aaaad47f19ec
17 swift-frontend  0x0000aaaad47ecc20
18 swift-frontend  0x0000aaaad47ef7b0
19 swift-frontend  0x0000aaaad47ecec4
20 swift-frontend  0x0000aaaad47ec2cc
21 swift-frontend  0x0000aaaad43195c4
22 swift-frontend  0x0000aaaad47f4ba4
23 swift-frontend  0x0000aaaad47f1ca4
24 swift-frontend  0x0000aaaad47f1710
25 swift-frontend  0x0000aaaad47ed0a4
26 swift-frontend  0x0000aaaad47ec2cc
27 swift-frontend  0x0000aaaad4313ad4
28 swift-frontend  0x0000aaaad42b689c
29 swift-frontend  0x0000aaaad433f21c
30 swift-frontend  0x0000aaaad433f01c
31 swift-frontend  0x0000aaaad433ef1c
32 swift-frontend  0x0000aaaad43b280c
33 swift-frontend  0x0000aaaad439417c
34 swift-frontend  0x0000aaaad4394070
35 swift-frontend  0x0000aaaad483d904
36 swift-frontend  0x0000aaaad43af538
37 swift-frontend  0x0000aaaad440b684
38 swift-frontend  0x0000aaaad440b508
39 swift-frontend  0x0000aaaad483d680
40 swift-frontend  0x0000aaaad4378bc8
41 swift-frontend  0x0000aaaad4378b2c
42 swift-frontend  0x0000aaaad4436bbc
43 swift-frontend  0x0000aaaad443871c
44 swift-frontend  0x0000aaaad4436b04
45 swift-frontend  0x0000aaaad352589c
46 swift-frontend  0x0000aaaad32d0c28
47 swift-frontend  0x0000aaaad32d01a0
48 swift-frontend  0x0000aaaad30dd334
49 libc.so.6       0x0000ffffa34d73fc
50 libc.so.6       0x0000ffffa34d74cc __libc_start_main + 152
51 swift-frontend  0x0000aaaad30dc030

*** Signal 11: Backtracing from 0xaaaad4844188... done ***

*** Program crashed: Bad pointer dereference at 0x0000000000000038 ***

Thread 0 "swift-frontend" crashed:

 0      0x0000aaaad4844188 swift::PatternBindingDecl::getAnchoringVarDecl(unsigned int) const + 48 in swift-frontend
 1 [ra] 0x0000aaaad48fb524 swift::FragileFunctionKindRequest::evaluate(swift::Evaluator&, swift::DeclContext*) const + 759 in swift-frontend
 2 [ra] 0x0000aaaad48fe1d4 swift::FragileFunctionKindRequest::OutputType swift::Evaluator::getResultUncached<swift::FragileFunctionKindRequest, swift::evaluateOrDefault<swift::FragileFunctionKindRequest>(swift::Evaluator&, swift::FragileFunctionKindRequest, swift::FragileFunctionKindRequest::OutputType)::{lambda()#1}>(swift::FragileFunctionKindRequest const&, swift::evaluateOrDefault<swift::FragileFunctionKindRequest>(swift::Evaluator&, swift::FragileFunctionKindRequest, swift::FragileFunctionKindRequest::OutputType)::{lambda()#1}) + 187 in swift-frontend
 3 [ra] 0x0000aaaad48fe078 swift::FragileFunctionKindRequest::OutputType swift::Evaluator::getResultCached<swift::FragileFunctionKindRequest, swift::evaluateOrDefault<swift::FragileFunctionKindRequest>(swift::Evaluator&, swift::FragileFunctionKindRequest, swift::FragileFunctionKindRequest::OutputType)::{lambda()#1}, (void*)0>(swift::FragileFunctionKindRequest const&, swift::evaluateOrDefault<swift::FragileFunctionKindRequest>(swift::Evaluator&, swift::FragileFunctionKindRequest, swift::FragileFunctionKindRequest::OutputType)::{lambda()#1}) + 331 in swift-frontend
 4 [ra] 0x0000aaaad48fb220 swift::DeclContext::getFragileFunctionKind() const + 119 in swift-frontend
 5 [ra] 0x0000aaaad430dfd0 swift::ExportContext::forFunctionBody(swift::DeclContext*, swift::SourceLoc) + 51 in swift-frontend
 6 [ra] 0x0000aaaad4319160 (anonymous namespace)::ExprAvailabilityWalker::walkToExprPre(swift::Expr*) + 2327 in swift-frontend
 7 [ra] 0x0000aaaad47ef374 swift::ASTVisitor<(anonymous namespace)::Traversal, swift::Expr*, swift::Stmt*, bool, swift::Pattern*, bool, void>::visitFunctionConversionExpr(swift::FunctionConversionExpr*) + 47 in swift-frontend
 8 [ra] 0x0000aaaad47ece88 (anonymous namespace)::Traversal::visit(swift::Expr*) + 703 in swift-frontend
 9 [ra] 0x0000aaaad47ec2cc swift::Expr::walk(swift::ASTWalker&) + 95 in swift-frontend
10 [ra] 0x0000aaaad43195c4 (anonymous namespace)::ExprAvailabilityWalker::walkToArgumentPre(swift::Argument const&) + 35 in swift-frontend
11 [ra] 0x0000aaaad47f4ba4 (anonymous namespace)::Traversal::visit(swift::ArgumentList*) + 167 in swift-frontend
12 [ra] 0x0000aaaad47f19ec (anonymous namespace)::Traversal::visitApplyExpr(swift::ApplyExpr*) + 195 in swift-frontend
13 [ra] 0x0000aaaad47ecc20 (anonymous namespace)::Traversal::visit(swift::Expr*) + 87 in swift-frontend
14 [ra] 0x0000aaaad47ef7b0 (anonymous namespace)::Traversal::visitErasureExpr(swift::ErasureExpr*) + 91 in swift-frontend
15 [ra] 0x0000aaaad47ecec4 (anonymous namespace)::Traversal::visit(swift::Expr*) + 763 in swift-frontend
16 [ra] 0x0000aaaad47ec2cc swift::Expr::walk(swift::ASTWalker&) + 95 in swift-frontend
17 [ra] 0x0000aaaad43195c4 (anonymous namespace)::ExprAvailabilityWalker::walkToArgumentPre(swift::Argument const&) + 35 in swift-frontend
18 [ra] 0x0000aaaad47f4ba4 (anonymous namespace)::Traversal::visit(swift::ArgumentList*) + 167 in swift-frontend
19 [ra] 0x0000aaaad47f1ca4 (anonymous namespace)::Traversal::visitFreestandingMacroArgs(swift::FreestandingMacroExpansion*) + 151 in swift-frontend
20 [ra] 0x0000aaaad47f1710 (anonymous namespace)::Traversal::visitMacroExpansionExpr(swift::MacroExpansionExpr*) + 107 in swift-frontend
21 [ra] 0x0000aaaad47ed0a4 (anonymous namespace)::Traversal::visit(swift::Expr*) + 1243 in swift-frontend
22 [ra] 0x0000aaaad47ec2cc swift::Expr::walk(swift::ASTWalker&) + 95 in swift-frontend
23 [ra] 0x0000aaaad4313ad4 swift::diagnoseExprAvailability(swift::Expr const*, swift::DeclContext*) + 167 in swift-frontend
24 [ra] 0x0000aaaad42b689c swift::performSyntacticExprDiagnostics(swift::Expr const*, swift::DeclContext const*, std::optional<swift::ContextualTypePurpose>, bool, bool, bool) + 1679 in swift-frontend
25 [ra] 0x0000aaaad433f21c swift::TypeChecker::typeCheckTarget(swift::constraints::SyntacticElementTarget&, swift::optionset::OptionSet<swift::TypeCheckExprFlags, unsigned int>) + 471 in swift-frontend
26 [ra] 0x0000aaaad433f01c swift::TypeChecker::typeCheckExpression(swift::constraints::SyntacticElementTarget&, swift::optionset::OptionSet<swift::TypeCheckExprFlags, unsigned int>) + 175 in swift-frontend
27 [ra] 0x0000aaaad433ef1c swift::TypeChecker::typeCheckExpression(swift::Expr*&, swift::DeclContext*, swift::constraints::ContextualTypeInfo, swift::optionset::OptionSet<swift::TypeCheckExprFlags, unsigned int>) + 91 in swift-frontend
28 [ra] 0x0000aaaad43b280c swift::ResolveMacroRequest::evaluate(swift::Evaluator&, swift::UnresolvedMacroReference, swift::DeclContext*) const + 723 in swift-frontend
29 [ra] 0x0000aaaad439417c swift::ResolveMacroRequest::OutputType swift::Evaluator::getResultUncached<swift::ResolveMacroRequest, swift::evaluateOrDefault<swift::ResolveMacroRequest>(swift::Evaluator&, swift::ResolveMacroRequest, swift::ResolveMacroRequest::OutputType)::{lambda()#1}>(swift::ResolveMacroRequest const&, swift::evaluateOrDefault<swift::ResolveMacroRequest>(swift::Evaluator&, swift::ResolveMacroRequest, swift::ResolveMacroRequest::OutputType)::{lambda()#1}) + 195 in swift-frontend
30 [ra] 0x0000aaaad4394070 swift::ResolveMacroRequest::OutputType swift::Evaluator::getResultCached<swift::ResolveMacroRequest, swift::evaluateOrDefault<swift::ResolveMacroRequest>(swift::Evaluator&, swift::ResolveMacroRequest, swift::ResolveMacroRequest::OutputType)::{lambda()#1}, (void*)0>(swift::ResolveMacroRequest const&, swift::evaluateOrDefault<swift::ResolveMacroRequest>(swift::Evaluator&, swift::ResolveMacroRequest, swift::ResolveMacroRequest::OutputType)::{lambda()#1}) + 267 in swift-frontend
31 [ra] 0x0000aaaad483d904 swift::Decl::forEachAttachedMacro(swift::MacroRole, llvm::function_ref<void (swift::CustomAttr*, swift::MacroDecl*)>) const + 271 in swift-frontend
32 [ra] 0x0000aaaad43af538 swift::ExpandPeerMacroRequest::evaluate(swift::Evaluator&, swift::Decl*) const + 79 in swift-frontend
33 [ra] 0x0000aaaad440b684 swift::ExpandPeerMacroRequest::OutputType swift::Evaluator::getResultUncached<swift::ExpandPeerMacroRequest, swift::evaluateOrDefault<swift::ExpandPeerMacroRequest>(swift::Evaluator&, swift::ExpandPeerMacroRequest, swift::ExpandPeerMacroRequest::OutputType)::{lambda()#1}>(swift::ExpandPeerMacroRequest const&, swift::evaluateOrDefault<swift::ExpandPeerMacroRequest>(swift::Evaluator&, swift::ExpandPeerMacroRequest, swift::ExpandPeerMacroRequest::OutputType)::{lambda()#1}) + 207 in swift-frontend
34 [ra] 0x0000aaaad440b508 swift::ExpandPeerMacroRequest::OutputType swift::Evaluator::getResultCached<swift::ExpandPeerMacroRequest, swift::evaluateOrDefault<swift::ExpandPeerMacroRequest>(swift::Evaluator&, swift::ExpandPeerMacroRequest, swift::ExpandPeerMacroRequest::OutputType)::{lambda()#1}, (void*)0>(swift::ExpandPeerMacroRequest const&, swift::evaluateOrDefault<swift::ExpandPeerMacroRequest>(swift::Evaluator&, swift::ExpandPeerMacroRequest, swift::ExpandPeerMacroRequest::OutputType)::{lambda()#1}) + 327 in swift-frontend
35 [ra] 0x0000aaaad483d680 swift::Decl::visitAuxiliaryDecls(llvm::function_ref<void (swift::Decl*)>, bool) const + 163 in swift-frontend
36 [ra] 0x0000aaaad4378bc8 (anonymous namespace)::DeclChecker::visit(swift::Decl*) + 131 in swift-frontend
37 [ra] 0x0000aaaad4378b2c swift::TypeChecker::typeCheckDecl(swift::Decl*) + 135 in swift-frontend
38 [ra] 0x0000aaaad4436bbc swift::TypeCheckSourceFileRequest::evaluate(swift::Evaluator&, swift::SourceFile*) const + 143 in swift-frontend
39 [ra] 0x0000aaaad443871c swift::TypeCheckSourceFileRequest::OutputType swift::Evaluator::getResultUncached<swift::TypeCheckSourceFileRequest, swift::evaluateOrDefault<swift::TypeCheckSourceFileRequest>(swift::Evaluator&, swift::TypeCheckSourceFileRequest, swift::TypeCheckSourceFileRequest::OutputType)::{lambda()#1}>(swift::TypeCheckSourceFileRequest const&, swift::evaluateOrDefault<swift::TypeCheckSourceFileRequest>(swift::Evaluator&, swift::TypeCheckSourceFileRequest, swift::TypeCheckSourceFileRequest::OutputType)::{lambda()#1}) + 195 in swift-frontend
40 [ra] 0x0000aaaad4436b04 swift::performTypeChecking(swift::SourceFile&) + 83 in swift-frontend
41 [ra] 0x0000aaaad352589c swift::CompilerInstance::performSema() + 179 in swift-frontend
42 [ra] 0x0000aaaad32d0c28 performCompile(swift::CompilerInstance&, int&, swift::FrontendObserver*) + 811 in swift-frontend
43 [ra] 0x0000aaaad32d01a0 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 2359 in swift-frontend
44 [ra] 0x0000aaaad30dd334 swift::mainEntry(int, char const**) + 4163 in swift-frontend
45 [ra] 0x0000ffffa34d73fc <unknown> in libc.so.6
46 [ra] 0x0000ffffa34d74cc <unknown> in libc.so.6

Reproduction

  1. Run swift package init to create a Swift package.

  2. Add the following code to the testTarget's source file.

@Test(.enabled(if: Bool.random())) // ✅ Works fine
func example1() async throws {}

@Test(.enabled { Bool.random() }) // ❌ Compiler crash
func example2() async throws {}

Expected behavior

No compiler crash

Environment

Swift version 6.0.3 (swift-6.0.3-RELEASE)
Target: aarch64-unknown-linux-gnu

Linux ubuntu 6.12.10-orbstack-00297-gf8f6e015b993 #42 SMP Sun Jan 19 03:00:07 UTC 2025 aarch64 aarch64 aarch64 GNU/Linux

Additional information

  1. Maybe this is not something we can fix at swift-testing, but rather a swift-compiler side bug.
  2. Maybe we can consider adding some test case here to know such corner case in advance.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bug🪲 Something isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions