Skip to content

[clang] Crash with -std=gnu++20 and lambda. #122815

@ayermolo

Description

@ayermolo

I saw a crash in clang that is build with assertions in our internal codebase.
I was able to reduce it to a small example:

enum class Signal2 {
 ENUM1,
 ENUM2,
};
void func() {
  const auto funcL =
   [](const Signal2(&srcSignals)[]) {};
   funcL({Signal2::ENUM1, Signal2::ENUM2});
}

Full stack trace:

clang++: /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/CodeGen/CGCall.cpp:4536: void clang::CodeGen::CodeGenFunction::EmitCallArgs(CallArgList &, PrototypeWrapper, llvm::iterator_range<CallExpr::const_arg_iterator>, AbstractCallee, unsigned int, EvaluationOrder): Assertion `(isGenericMethod || Ty->isVariablyModifiedType() || Ty.getNonReferenceType()->isObjCRetainableType() || getContext() .getCanonicalType(Ty.getNonReferenceType()) .getTypePtr() == getContext().getCanonicalType((*Arg)->getType()).getTypePtr()) && "type mismatch in call argument!"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0.	Program arguments: /home/ayermolo/local/llvm-build-upstream-release/bin/clang++ main.cpp -S -emit-llvm -o main.o -std=gnu++20
1.	<eof> parser at end of file
2.	main.cpp:5:6: LLVM IR generation of declaration 'func'
3.	main.cpp:5:6: Generating code for declaration 'func'
 #0 0x00005557c7baa498 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/ayermolo/local/upstream-llvm/llvm-project/llvm/lib/Support/Unix/Signals.inc:723:13
 #1 0x00005557c7ba7fde llvm::sys::RunSignalHandlers() /home/ayermolo/local/upstream-llvm/llvm-project/llvm/lib/Support/Signals.cpp:106:18
 #2 0x00005557c7b193f6 (anonymous namespace)::CrashRecoveryContextImpl::HandleCrash(int, unsigned long) /home/ayermolo/local/upstream-llvm/llvm-project/llvm/lib/Support/CrashRecoveryContext.cpp:73:5
 #3 0x00005557c7b193f6 CrashRecoverySignalHandler(int) /home/ayermolo/local/upstream-llvm/llvm-project/llvm/lib/Support/CrashRecoveryContext.cpp:390:51
 #4 0x00007f2098a3e730 __restore_rt (/usr/lib64/libc.so.6+0x3e730)
 #5 0x00007f2098a8bacc __pthread_kill_implementation (/usr/lib64/libc.so.6+0x8bacc)
 #6 0x00007f2098a3e686 gsignal (/usr/lib64/libc.so.6+0x3e686)
 #7 0x00007f2098a28833 abort (/usr/lib64/libc.so.6+0x28833)
 #8 0x00007f2098a2875b _nl_load_domain.cold (/usr/lib64/libc.so.6+0x2875b)
 #9 0x00007f2098a373c6 (/usr/lib64/libc.so.6+0x373c6)
#10 0x00005557c7e64f96 clang::QualType const* std::__find_if<clang::QualType const*, __gnu_cxx::__ops::_Iter_pred<hasInAllocaArgs(clang::CodeGen::CodeGenModule&, clang::CallingConv, llvm::ArrayRef<clang::QualType>)::$_0>>(clang::QualType const*, clang::QualType const*, __gnu_cxx::__ops::_Iter_pred<hasInAllocaArgs(clang::CodeGen::CodeGenModule&, clang::CallingConv, llvm::ArrayRef<clang::QualType>)::$_0>, std::random_access_iterator_tag) /usr/lib/gcc/x86_64-redhat-linux/11/../../../../include/c++/11/bits/stl_algobase.h:2089:22
#11 0x00005557c7e64f96 clang::QualType const* std::__find_if<clang::QualType const*, __gnu_cxx::__ops::_Iter_pred<hasInAllocaArgs(clang::CodeGen::CodeGenModule&, clang::CallingConv, llvm::ArrayRef<clang::QualType>)::$_0>>(clang::QualType const*, clang::QualType const*, __gnu_cxx::__ops::_Iter_pred<hasInAllocaArgs(clang::CodeGen::CodeGenModule&, clang::CallingConv, llvm::ArrayRef<clang::QualType>)::$_0>) /usr/lib/gcc/x86_64-redhat-linux/11/../../../../include/c++/11/bits/stl_algobase.h:2117:14
#12 0x00005557c7e64f96 clang::QualType const* std::find_if<clang::QualType const*, hasInAllocaArgs(clang::CodeGen::CodeGenModule&, clang::CallingConv, llvm::ArrayRef<clang::QualType>)::$_0>(clang::QualType const*, clang::QualType const*, hasInAllocaArgs(clang::CodeGen::CodeGenModule&, clang::CallingConv, llvm::ArrayRef<clang::QualType>)::$_0) /usr/lib/gcc/x86_64-redhat-linux/11/../../../../include/c++/11/bits/stl_algo.h:3910:14
#13 0x00005557c7e64f96 bool std::none_of<clang::QualType const*, hasInAllocaArgs(clang::CodeGen::CodeGenModule&, clang::CallingConv, llvm::ArrayRef<clang::QualType>)::$_0>(clang::QualType const*, clang::QualType const*, hasInAllocaArgs(clang::CodeGen::CodeGenModule&, clang::CallingConv, llvm::ArrayRef<clang::QualType>)::$_0) /usr/lib/gcc/x86_64-redhat-linux/11/../../../../include/c++/11/bits/stl_algo.h:471:24
#14 0x00005557c7e64f96 bool std::any_of<clang::QualType const*, hasInAllocaArgs(clang::CodeGen::CodeGenModule&, clang::CallingConv, llvm::ArrayRef<clang::QualType>)::$_0>(clang::QualType const*, clang::QualType const*, hasInAllocaArgs(clang::CodeGen::CodeGenModule&, clang::CallingConv, llvm::ArrayRef<clang::QualType>)::$_0) /usr/lib/gcc/x86_64-redhat-linux/11/../../../../include/c++/11/bits/stl_algo.h:490:15
#15 0x00005557c7e64f96 bool llvm::any_of<llvm::ArrayRef<clang::QualType>&, hasInAllocaArgs(clang::CodeGen::CodeGenModule&, clang::CallingConv, llvm::ArrayRef<clang::QualType>)::$_0>(llvm::ArrayRef<clang::QualType>&, hasInAllocaArgs(clang::CodeGen::CodeGenModule&, clang::CallingConv, llvm::ArrayRef<clang::QualType>)::$_0) /home/ayermolo/local/upstream-llvm/llvm-project/llvm/include/llvm/ADT/STLExtras.h:1747:10
#16 0x00005557c7e64f96 hasInAllocaArgs(clang::CodeGen::CodeGenModule&, clang::CallingConv, llvm::ArrayRef<clang::QualType>) /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/CodeGen/CGCall.cpp:4466:10
#17 0x00005557c7e64f96 clang::CodeGen::CodeGenFunction::EmitCallArgs(clang::CodeGen::CallArgList&, clang::CodeGen::CodeGenFunction::PrototypeWrapper, llvm::iterator_range<clang::Stmt::CastIterator<clang::Expr, clang::Expr const* const, clang::Stmt const* const>>, clang::CodeGen::CodeGenFunction::AbstractCallee, unsigned int, clang::CodeGen::CodeGenFunction::EvaluationOrder) /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/CodeGen/CGCall.cpp:4585:7
#18 0x00005557c8149ce8 commonEmitCXXMemberOrOperatorCall(clang::CodeGen::CodeGenFunction&, clang::GlobalDecl, llvm::Value*, llvm::Value*, clang::QualType, clang::CallExpr const*, clang::CodeGen::CallArgList&, clang::CodeGen::CallArgList*) /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/CodeGen/CGExprCXX.cpp:75:9
#19 0x00005557c8149714 clang::CodeGen::CodeGenFunction::EmitCXXMemberOrOperatorCall(clang::CXXMethodDecl const*, clang::CodeGen::CGCallee const&, clang::CodeGen::ReturnValueSlot, llvm::Value*, llvm::Value*, clang::QualType, clang::CallExpr const*, clang::CodeGen::CallArgList*, llvm::CallBase**) /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/CodeGen/CGExprCXX.cpp:94:18
#20 0x00005557c814cc75 clang::CodeGen::CodeGenFunction::EmitCXXMemberOrOperatorMemberCallExpr(clang::CallExpr const*, clang::CXXMethodDecl const*, clang::CodeGen::ReturnValueSlot, bool, clang::NestedNameSpecifier*, bool, clang::Expr const*, llvm::CallBase**) /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/CodeGen/CGExprCXX.cpp:0:10
#21 0x00005557c814d240 clang::CodeGen::CodeGenFunction::EmitCXXOperatorMemberCallExpr(clang::CXXOperatorCallExpr const*, clang::CXXMethodDecl const*, clang::CodeGen::ReturnValueSlot, llvm::CallBase**) /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/CodeGen/CGExprCXX.cpp:501:3
#22 0x00005557c7f84efd clang::CodeGen::CodeGenFunction::EmitCallExpr(clang::CallExpr const*, clang::CodeGen::ReturnValueSlot, llvm::CallBase**) /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/CodeGen/CGExpr.cpp:0:14
#23 0x00005557c7f9f00e clang::CodeGen::RValue::isScalar() const /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/CodeGen/CGValue.h:64:41
#24 0x00005557c7f9f00e clang::CodeGen::RValue::getScalarVal() const /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/CodeGen/CGValue.h:72:5
#25 0x00005557c7f9f00e (anonymous namespace)::ScalarExprEmitter::VisitCallExpr(clang::CallExpr const*) /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/CodeGen/CGExprScalar.cpp:626:36
#26 0x00005557c7f9df12 (anonymous namespace)::ScalarExprEmitter::Visit(clang::Expr*) /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/CodeGen/CGExprScalar.cpp:447:52
#27 0x00005557c7f9df12 (anonymous namespace)::ScalarExprEmitter::VisitExprWithCleanups(clang::ExprWithCleanups*) /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/CodeGen/CGExprScalar.cpp:2774:14
#28 0x00005557c7f8b54d (anonymous namespace)::ScalarExprEmitter::Visit(clang::Expr*) /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/CodeGen/CGExprScalar.cpp:447:52
#29 0x00005557c7f8b54d clang::CodeGen::CodeGenFunction::EmitScalarExpr(clang::Expr const*, bool) /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/CodeGen/CGExprScalar.cpp:5576:8
#30 0x00005557c7f5ca4c clang::CodeGen::CodeGenFunction::EmitAnyExpr(clang::Expr const*, clang::CodeGen::AggValueSlot, bool) /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/CodeGen/CGExpr.cpp:0:24
#31 0x00005557c7f5ca4c clang::CodeGen::CodeGenFunction::EmitIgnoredExpr(clang::Expr const*) /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/CodeGen/CGExpr.cpp:215:18
#32 0x00005557c7f432d1 llvm::IRBuilderBase::GetInsertBlock() const /home/ayermolo/local/upstream-llvm/llvm-project/llvm/include/llvm/IR/IRBuilder.h:188:47
#33 0x00005557c7f432d1 clang::CodeGen::CodeGenFunction::EmitStmt(clang::Stmt const*, llvm::ArrayRef<clang::Attr const*>) /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/CodeGen/CGStmt.cpp:130:42
#34 0x00005557c7f536c0 clang::CodeGen::CodeGenFunction::EmitCompoundStmtWithoutScope(clang::CompoundStmt const&, bool, clang::CodeGen::AggValueSlot) /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/CodeGen/CGStmt.cpp:557:22
#35 0x00005557c7f2f15e clang::CodeGen::CodeGenFunction::getLangOpts() const /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/CodeGen/CodeGenFunction.h:2145:51
#36 0x00005557c7f2f15e clang::CodeGen::CodeGenFunction::GenerateCode(clang::GlobalDecl, llvm::Function*, clang::CodeGen::CGFunctionInfo const&) /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/CodeGen/CodeGenFunction.cpp:1595:7
#37 0x00005557c7de8da0 clang::CodeGen::CodeGenModule::EmitGlobalFunctionDefinition(clang::GlobalDecl, llvm::GlobalValue*) /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/CodeGen/CodeGenModule.cpp:6104:3
#38 0x00005557c7de0583 llvm::TimeTraceScope::~TimeTraceScope() /home/ayermolo/local/upstream-llvm/llvm-project/llvm/include/llvm/Support/TimeProfiler.h:198:9
#39 0x00005557c7de0583 clang::CodeGen::CodeGenModule::EmitGlobalDefinition(clang::GlobalDecl, llvm::GlobalValue*) /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/CodeGen/CodeGenModule.cpp:4233:3
#40 0x00005557c7de56f9 clang::CodeGen::CodeGenModule::EmitGlobal(clang::GlobalDecl) /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/CodeGen/CodeGenModule.cpp:3944:5
#41 0x00005557c7ddef31 clang::CodeGen::CodeGenModule::EmitTopLevelDecl(clang::Decl*) /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/CodeGen/CodeGenModule.cpp:6992:5
#42 0x00005557c84ff88c (anonymous namespace)::CodeGeneratorImpl::HandleTopLevelDecl(clang::DeclGroupRef) /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/CodeGen/ModuleBuilder.cpp:189:73
#43 0x00005557c84f7756 clang::BackendConsumer::HandleTopLevelDecl(clang::DeclGroupRef) /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/CodeGen/CodeGenAction.cpp:198:7
#44 0x00005557ca35953a clang::ParseAST(clang::Sema&, bool, bool) /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/Parse/ParseAST.cpp:175:11
#45 0x00005557c89aa11f clang::FrontendAction::Execute() /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/Frontend/FrontendAction.cpp:1081:10
#46 0x00005557c891935d llvm::Error::getPtr() const /home/ayermolo/local/upstream-llvm/llvm-project/llvm/include/llvm/Support/Error.h:279:42
#47 0x00005557c891935d llvm::Error::operator bool() /home/ayermolo/local/upstream-llvm/llvm-project/llvm/include/llvm/Support/Error.h:242:16
#48 0x00005557c891935d clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/Frontend/CompilerInstance.cpp:1062:23
#49 0x00005557c8a9ce87 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:296:25
#50 0x00005557c62e4937 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) /home/ayermolo/local/upstream-llvm/llvm-project/clang/tools/driver/cc1_main.cpp:286:15
#51 0x00005557c62e0e4e ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) /home/ayermolo/local/upstream-llvm/llvm-project/clang/tools/driver/driver.cpp:218:12
#52 0x00005557c876ac19 clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const::$_0::operator()() const /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/Driver/Job.cpp:437:30
#53 0x00005557c876ac19 void llvm::function_ref<void ()>::callback_fn<clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const::$_0>(long) /home/ayermolo/local/upstream-llvm/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:46:12
#54 0x00005557c7b1913e llvm::function_ref<void ()>::operator()() const /home/ayermolo/local/upstream-llvm/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:0:12
#55 0x00005557c7b1913e llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) /home/ayermolo/local/upstream-llvm/llvm-project/llvm/lib/Support/CrashRecoveryContext.cpp:426:3
#56 0x00005557c876a1a2 clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/Driver/Job.cpp:437:7
#57 0x00005557c8725e2c clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/Driver/Compilation.cpp:196:15
#58 0x00005557c8726137 clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/Driver/Compilation.cpp:251:13
#59 0x00005557c8744348 llvm::SmallVectorBase<unsigned int>::empty() const /home/ayermolo/local/upstream-llvm/llvm-project/llvm/include/llvm/ADT/SmallVector.h:81:46
#60 0x00005557c8744348 clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) /home/ayermolo/local/upstream-llvm/llvm-project/clang/lib/Driver/Driver.cpp:2119:23
#61 0x00005557c62e047a clang_main(int, char**, llvm::ToolContext const&) /home/ayermolo/local/upstream-llvm/llvm-project/clang/tools/driver/driver.cpp:398:21
#62 0x00005557c62f06e7 main /home/ayermolo/local/llvm-build-upstream-release/tools/clang/tools/driver/clang-driver.cpp:17:10
#63 0x00007f2098a295d0 __libc_start_call_main (/usr/lib64/libc.so.6+0x295d0)
#64 0x00007f2098a29680 __libc_start_main@GLIBC_2.2.5 (/usr/lib64/libc.so.6+0x29680)
#65 0x00005557c62dea25 _start (/home/ayermolo/local/llvm-build-upstream-release/bin/clang+++0x373ca25)
clang++: error: clang frontend command failed with exit code 134 (use -v to see invocation)
clang version 20.0.0git
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /data/users/ayermolo/llvm-build-upstream-release/bin
Build config: +assertions
clang++: note: diagnostic msg: 
********************
PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang++: note: diagnostic msg: /tmp/main-7b8c1c.cpp
clang++: note: diagnostic msg: /tmp/main-7b8c1c.sh
clang++: note: diagnostic msg: 
********************

Metadata

Metadata

Assignees

No one assigned

    Labels

    clang:codegenIR generation bugs: mangling, exceptions, etc.crashPrefer [crash-on-valid] or [crash-on-invalid]duplicateResolved as duplicatelambdaC++11 lambda expressions

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions