Skip to content

[Typechecker]: Crash involving trailing closures, callAsFunction, and duplicate declarations #85364

@jamieQ

Description

@jamieQ

Description

No response

Reproduction

struct S {
  var c: () -> Void
}

S {}

struct S {
  func callAsFunction(_: () -> Void) {}
}

an additional variant that looks like it hits the same assertion occurs when overloading initializers (as @YOCKOW noted in #85378):

struct S {
  init() {
    print("`init` without block is called.")
  }

  init(_ block: () -> Void) {
    print("`init` with block is called.")
    block()
  }

  func callAsFunction(_ block: () -> Void) {
    print("`callAsFunction` is called.")
    block()
  }
}

S {}

Stack dump

swift-frontend: /home/build-user/llvm-project/llvm/include/llvm/ADT/ArrayRef.h:157: const T &llvm::ArrayRef<swift::ParamDecl *>::back() const [T = swift::ParamDecl *]: Assertion `!empty()' failed.
Please submit a bug report (https://swift.org/contributing/#reporting-bugs) and include the crash backtrace.
Stack dump:
0.	Program arguments: /cefs/fe/fe478d39bbcfde13719a3634_swift-nightly/usr/bin/swift-frontend -frontend -S -primary-file <source> -target x86_64-unknown-linux-gnu -disable-objc-interop -no-color-diagnostics -Xcc -fno-color-diagnostics -g -debug-info-format=dwarf -dwarf-version=4 -empty-abi-descriptor -enable-anonymous-context-mangled-names -file-compilation-dir /app -Xllvm --x86-asm-syntax=intel -no-auto-bridging-header-chaining -module-name output -in-process-plugin-server-path /cefs/fe/fe478d39bbcfde13719a3634_swift-nightly/usr/lib/swift/host/libSwiftInProcPluginServer.so -plugin-path /cefs/fe/fe478d39bbcfde13719a3634_swift-nightly/usr/lib/swift/host/plugins -plugin-path /cefs/fe/fe478d39bbcfde13719a3634_swift-nightly/usr/local/lib/swift/host/plugins -o /app/output.s
1.	Swift version 6.3-dev (LLVM bff1370bd79c983, Swift 57cf4ce563f700b)
2.	Compiling with effective version 5.10
3.	While evaluating request TypeCheckPrimaryFileRequest(source_file "<source>")
4.	While type-checking statement at [<source>:5:1 - line:5:4] RangeText="S {"
5.	While type-checking expression at [<source>:5:1 - line:5:4] RangeText="S {"
6.	While type-checking-target starting at <source>:5:1
 #0 0x000064fffeb0c418 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/cefs/fe/fe478d39bbcfde13719a3634_swift-nightly/usr/bin/swift-frontend+0x8958418)
 #1 0x000064fffeb09c05 llvm::sys::RunSignalHandlers() (/cefs/fe/fe478d39bbcfde13719a3634_swift-nightly/usr/bin/swift-frontend+0x8955c05)
 #2 0x000064fffeb0d1c1 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
 #3 0x00007343a3e42520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
 #4 0x00007343a3e969fc pthread_kill (/lib/x86_64-linux-gnu/libc.so.6+0x969fc)
 #5 0x00007343a3e42476 gsignal (/lib/x86_64-linux-gnu/libc.so.6+0x42476)
 #6 0x00007343a3e287f3 abort (/lib/x86_64-linux-gnu/libc.so.6+0x287f3)
 #7 0x00007343a3e2871b (/lib/x86_64-linux-gnu/libc.so.6+0x2871b)
 #8 0x00007343a3e39e96 (/lib/x86_64-linux-gnu/libc.so.6+0x39e96)
 #9 0x000064fff8101175 swift::constraints::TrailingClosureAmbiguityFailure::diagnoseAsNote() (/cefs/fe/fe478d39bbcfde13719a3634_swift-nightly/usr/bin/swift-frontend+0x1f4d175)
#10 0x000064fff815b8bf swift::constraints::ConstraintSystem::diagnoseAmbiguity(llvm::ArrayRef<swift::constraints::Solution>) (/cefs/fe/fe478d39bbcfde13719a3634_swift-nightly/usr/bin/swift-frontend+0x1fa78bf)
#11 0x000064fff81569bb swift::constraints::ConstraintSystem::salvage() (/cefs/fe/fe478d39bbcfde13719a3634_swift-nightly/usr/bin/swift-frontend+0x1fa29bb)
#12 0x000064fff80a76d6 swift::constraints::ConstraintSystem::solve(swift::constraints::SyntacticElementTarget&, swift::FreeTypeVariableBinding) (/cefs/fe/fe478d39bbcfde13719a3634_swift-nightly/usr/bin/swift-frontend+0x1ef36d6)
#13 0x000064fff82602ee swift::TypeChecker::typeCheckTarget(swift::constraints::SyntacticElementTarget&, swift::optionset::OptionSet<swift::TypeCheckExprFlags, unsigned int>, swift::DiagnosticTransaction*) (/cefs/fe/fe478d39bbcfde13719a3634_swift-nightly/usr/bin/swift-frontend+0x20ac2ee)
#14 0x000064fff8260131 swift::TypeChecker::typeCheckExpression(swift::constraints::SyntacticElementTarget&, swift::optionset::OptionSet<swift::TypeCheckExprFlags, unsigned int>, swift::DiagnosticTransaction*) (/cefs/fe/fe478d39bbcfde13719a3634_swift-nightly/usr/bin/swift-frontend+0x20ac131)
#15 0x000064fff8260006 swift::TypeChecker::typeCheckExpression(swift::Expr*&, swift::DeclContext*, swift::constraints::ContextualTypeInfo, swift::optionset::OptionSet<swift::TypeCheckExprFlags, unsigned int>) (/cefs/fe/fe478d39bbcfde13719a3634_swift-nightly/usr/bin/swift-frontend+0x20ac006)
#16 0x000064fff836714b (anonymous namespace)::StmtChecker::typeCheckASTNode(swift::ASTNode&) TypeCheckStmt.cpp:0:0
#17 0x000064fff836afbd swift::ASTVisitor<(anonymous namespace)::StmtChecker, void, swift::Stmt*, void, void, void, void>::visit(swift::Stmt*) TypeCheckStmt.cpp:0:0
#18 0x000064fff8368fec bool (anonymous namespace)::StmtChecker::typeCheckStmt<swift::BraceStmt>(swift::BraceStmt*&) TypeCheckStmt.cpp:0:0
#19 0x000064fff8369083 swift::TypeChecker::typeCheckTopLevelCodeDecl(swift::TopLevelCodeDecl*) (/cefs/fe/fe478d39bbcfde13719a3634_swift-nightly/usr/bin/swift-frontend+0x21b5083)
#20 0x000064fff83d969a swift::TypeCheckPrimaryFileRequest::evaluate(swift::Evaluator&, swift::SourceFile*) const (/cefs/fe/fe478d39bbcfde13719a3634_swift-nightly/usr/bin/swift-frontend+0x222569a)
#21 0x000064fff83dda4b swift::TypeCheckPrimaryFileRequest::OutputType swift::Evaluator::getResultUncached<swift::TypeCheckPrimaryFileRequest, swift::TypeCheckPrimaryFileRequest::OutputType swift::evaluateOrDefault<swift::TypeCheckPrimaryFileRequest>(swift::Evaluator&, swift::TypeCheckPrimaryFileRequest, swift::TypeCheckPrimaryFileRequest::OutputType)::'lambda'()>(swift::TypeCheckPrimaryFileRequest const&, swift::TypeCheckPrimaryFileRequest::OutputType swift::evaluateOrDefault<swift::TypeCheckPrimaryFileRequest>(swift::Evaluator&, swift::TypeCheckPrimaryFileRequest, swift::TypeCheckPrimaryFileRequest::OutputType)::'lambda'()) crtstuff.c:0:0
#22 0x000064fff83d95a5 swift::performTypeChecking(swift::SourceFile&) (/cefs/fe/fe478d39bbcfde13719a3634_swift-nightly/usr/bin/swift-frontend+0x22255a5)
#23 0x000064fff6f16e59 bool llvm::function_ref<bool (swift::SourceFile&)>::callback_fn<swift::CompilerInstance::performSema()::$_10>(long, swift::SourceFile&) Frontend.cpp:0:0
#24 0x000064fff6f0dada swift::CompilerInstance::forEachFileToTypeCheck(llvm::function_ref<bool (swift::SourceFile&)>) (/cefs/fe/fe478d39bbcfde13719a3634_swift-nightly/usr/bin/swift-frontend+0xd59ada)
#25 0x000064fff6f0d8cb swift::CompilerInstance::performSema() (/cefs/fe/fe478d39bbcfde13719a3634_swift-nightly/usr/bin/swift-frontend+0xd598cb)
#26 0x000064fff6b87372 withSemanticAnalysis(swift::CompilerInstance&, swift::FrontendObserver*, llvm::function_ref<bool (swift::CompilerInstance&)>, bool) FrontendTool.cpp:0:0
#27 0x000064fff6b75f99 performCompile(swift::CompilerInstance&, int&, swift::FrontendObserver*, llvm::ArrayRef<char const*>) FrontendTool.cpp:0:0
#28 0x000064fff6b72bfe swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) (/cefs/fe/fe478d39bbcfde13719a3634_swift-nightly/usr/bin/swift-frontend+0x9bebfe)
#29 0x000064fff68c2aec swift::mainEntry(int, char const**) (/cefs/fe/fe478d39bbcfde13719a3634_swift-nightly/usr/bin/swift-frontend+0x70eaec)
#30 0x00007343a3e29d90 (/lib/x86_64-linux-gnu/libc.so.6+0x29d90)
#31 0x00007343a3e29e40 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x29e40)
#32 0x000064fff68c19d5 _start (/cefs/fe/fe478d39bbcfde13719a3634_swift-nightly/usr/bin/swift-frontend+0x70d9d5)

*** Signal 6: Backtracing from 0x7343a3f1e88d... done ***

*** Program crashed: Aborted at 0x0000280000000001 ***

Platform: x86_64 Linux (Ubuntu 22.04.5 LTS)

Expected behavior

No crash

Environment

Swift version 6.3-dev (LLVM bff1370bd79c983, Swift 57cf4ce)
Target: x86_64-unknown-linux-gnu

Additional information

forum post: https://forums.swift.org/t/why-can-initializer-parentheses-be-omitted-with-callasfunction-trailing-closure/83061
godbolt: https://swift.godbolt.org/z/97d3ex586

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugA deviation from expected or documented behavior. Also: expected but undesirable behavior.crashBug: A crash, i.e., an abnormal termination of softwaretriage neededThis issue needs more specific labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions