llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
28.05k stars 11.58k forks source link

[Clang][CodeGen] Crash when taking address of call operator of lambda with explicit object parameter with a derived class #97227

Open MitalAshok opened 2 months ago

MitalAshok commented 2 months ago

https://godbolt.org/z/8Ma8Yz5x1

inline auto get_lambda(int i) {
  return [i](this auto self) { return i; };
}

using lambda_type = decltype(get_lambda(0));

struct derived : lambda_type {};

int (*fptr)(derived) = &lambda_type::operator()<derived>;

This crashes:

clang-19: /llvm-project/llvm/include/llvm/ADT/DenseMap.h:213: const ValueT &llvm::DenseMapBase<llvm::DenseMap<const clang::CXXMethodDecl *, llvm::SmallVector<clang::CXXBaseSpecifier *, 4>>, const clang::CXXMethodDecl *, llvm::SmallVector<clang::CXXBaseSpecifier *, 4>, llvm::DenseMapInfo<const clang::CXXMethodDecl *>, llvm::detail::DenseMapPair<const clang::CXXMethodDecl *, llvm::SmallVector<clang::CXXBaseSpecifier *, 4>>>::at(const_arg_type_t<KeyT>) const [DerivedT = llvm::DenseMap<const clang::CXXMethodDecl *, llvm::SmallVector<clang::CXXBaseSpecifier *, 4>>, KeyT = const clang::CXXMethodDecl *, ValueT = llvm::SmallVector<clang::CXXBaseSpecifier *, 4>, KeyInfoT = llvm::DenseMapInfo<const clang::CXXMethodDecl *>, BucketT = llvm::detail::DenseMapPair<const clang::CXXMethodDecl *, llvm::SmallVector<clang::CXXBaseSpecifier *, 4>>]: Assertion `Iter != this->end() && "DenseMap::at failed due to a missing key"' 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: /cmake-build-debug/bin/clang-19 -cc1 -triple x86_64-unknown-linux-gnu -emit-obj -dumpdir a- -disable-free -clear-ast-before-backend -main-file-name test.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/llvm-project -fcoverage-compilation-dir=/llvm-project -resource-dir /cmake-build-debug/lib/clang/19 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/x86_64-linux-gnu/c++/12 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/backward -internal-isystem /cmake-build-debug/lib/clang/19/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/12/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -std=c++26 -fdeprecated-macro -ferror-limit 19 -fgnuc-version=4.2.1 -fno-implicit-modules -fskip-odr-check-in-gmf -fcxx-exceptions -fexceptions -fcolor-diagnostics -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/-1c9dca.o -x c++ test.cpp
1.  <eof> parser at end of file
2.  Per-file LLVM IR generation
3.  test.cpp:2:10: Generating code for declaration 'get_lambda(int)::(anonymous class)::operator()'
 #0 0x000056446608db8d llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /llvm-project/llvm/lib/Support/Unix/Signals.inc:723:11
 #1 0x000056446608e07b PrintStackTraceSignalHandler(void*) /llvm-project/llvm/lib/Support/Unix/Signals.inc:798:1
 #2 0x000056446608c0e6 llvm::sys::RunSignalHandlers() /llvm-project/llvm/lib/Support/Signals.cpp:105:5
 #3 0x000056446608e835 SignalHandler(int) /llvm-project/llvm/lib/Support/Unix/Signals.inc:413:1
 #4 0x00007f3e401df520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
 #5 0x00007f3e402339fc __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
 #6 0x00007f3e402339fc __pthread_kill_internal ./nptl/pthread_kill.c:78:10
 #7 0x00007f3e402339fc pthread_kill ./nptl/pthread_kill.c:89:10
 #8 0x00007f3e401df476 gsignal ./signal/../sysdeps/posix/raise.c:27:6
 #9 0x00007f3e401c57f3 abort ./stdlib/abort.c:81:7
#10 0x00007f3e401c571b _nl_load_domain ./intl/loadmsgcat.c:1177:9
#11 0x00007f3e401d6e96 (/lib/x86_64-linux-gnu/libc.so.6+0x39e96)
#12 0x0000564466889442 llvm::DenseMapBase<llvm::DenseMap<clang::CXXMethodDecl const*, llvm::SmallVector<clang::CXXBaseSpecifier*, 4u>, llvm::DenseMapInfo<clang::CXXMethodDecl const*, void>, llvm::detail::DenseMapPair<clang::CXXMethodDecl const*, llvm::SmallVector<clang::CXXBaseSpecifier*, 4u>>>, clang::CXXMethodDecl const*, llvm::SmallVector<clang::CXXBaseSpecifier*, 4u>, llvm::DenseMapInfo<clang::CXXMethodDecl const*, void>, llvm::detail::DenseMapPair<clang::CXXMethodDecl const*, llvm::SmallVector<clang::CXXBaseSpecifier*, 4u>>>::at(clang::CXXMethodDecl const*) const /llvm-project/llvm/include/llvm/ADT/DenseMap.h:214:12
#13 0x0000564466878c32 clang::CodeGen::CodeGenFunction::EmitLValueForLambdaField(clang::FieldDecl const*, llvm::Value*) /llvm-project/clang/lib/CodeGen/CGExpr.cpp:4713:26
#14 0x0000564466873dac EmitCapturedFieldLValue(clang::CodeGen::CodeGenFunction&, clang::FieldDecl const*, llvm::Value*) /llvm-project/clang/lib/CodeGen/CGExpr.cpp:2889:14
#15 0x000056446686043b clang::CodeGen::CodeGenFunction::EmitDeclRefLValue(clang::DeclRefExpr const*) /llvm-project/clang/lib/CodeGen/CGExpr.cpp:3022:9
#16 0x0000564466865ff0 clang::CodeGen::CodeGenFunction::EmitLValueHelper(clang::Expr const*, clang::CodeGen::KnownNonNull_t) /llvm-project/clang/lib/CodeGen/CGExpr.cpp:1549:12
#17 0x0000564466856e17 clang::CodeGen::CodeGenFunction::EmitLValue(clang::Expr const*, clang::CodeGen::KnownNonNull_t) /llvm-project/clang/lib/CodeGen/CGExpr.cpp:1502:7
#18 0x0000564466864165 clang::CodeGen::CodeGenFunction::EmitCheckedLValue(clang::Expr const*, clang::CodeGen::CodeGenFunction::TypeCheckKind) /llvm-project/clang/lib/CodeGen/CGExpr.cpp:1469:10
#19 0x00005644668afc6d (anonymous namespace)::ScalarExprEmitter::EmitCheckedLValue(clang::Expr const*, clang::CodeGen::CodeGenFunction::TypeCheckKind) /llvm-project/clang/lib/CodeGen/CGExprScalar.cpp:255:16
#20 0x00005644668afaf0 (anonymous namespace)::ScalarExprEmitter::EmitLoadOfLValue(clang::Expr const*) /llvm-project/clang/lib/CodeGen/CGExprScalar.cpp:304:33
#21 0x00005644668ac7e8 (anonymous namespace)::ScalarExprEmitter::VisitDeclRefExpr(clang::DeclRefExpr*) /llvm-project/clang/lib/CodeGen/CGExprScalar.cpp:524:5
#22 0x00005644668a4459 clang::StmtVisitorBase<std::add_pointer, (anonymous namespace)::ScalarExprEmitter, llvm::Value*>::Visit(clang::Stmt*) /cmake-build-debug/tools/clang/include/clang/AST/StmtNodes.inc:462:1
#23 0x0000564466899035 (anonymous namespace)::ScalarExprEmitter::Visit(clang::Expr*) /llvm-project/clang/lib/CodeGen/CGExprScalar.cpp:422:52
#24 0x00005644668b49ac (anonymous namespace)::ScalarExprEmitter::VisitCastExpr(clang::CastExpr*) /llvm-project/clang/lib/CodeGen/CGExprScalar.cpp:2505:5
#25 0x00005644668ad3ed clang::StmtVisitorBase<std::add_pointer, (anonymous namespace)::ScalarExprEmitter, llvm::Value*>::VisitImplicitCastExpr(clang::ImplicitCastExpr*) /cmake-build-debug/tools/clang/include/clang/AST/StmtNodes.inc:522:1
#26 0x00005644668a4509 clang::StmtVisitorBase<std::add_pointer, (anonymous namespace)::ScalarExprEmitter, llvm::Value*>::Visit(clang::Stmt*) /cmake-build-debug/tools/clang/include/clang/AST/StmtNodes.inc:522:1
#27 0x0000564466899035 (anonymous namespace)::ScalarExprEmitter::Visit(clang::Expr*) /llvm-project/clang/lib/CodeGen/CGExprScalar.cpp:422:52
#28 0x0000564466898e5a clang::CodeGen::CodeGenFunction::EmitScalarExpr(clang::Expr const*, bool) /llvm-project/clang/lib/CodeGen/CGExprScalar.cpp:5490:3
#29 0x00005644667a6485 clang::CodeGen::CodeGenFunction::EmitReturnStmt(clang::ReturnStmt const&) /llvm-project/clang/lib/CodeGen/CGStmt.cpp:1541:27
#30 0x00005644667a2c01 clang::CodeGen::CodeGenFunction::EmitStmt(clang::Stmt const*, llvm::ArrayRef<clang::Attr const*>) /llvm-project/clang/lib/CodeGen/CGStmt.cpp:160:75
#31 0x00005644667ac9c4 clang::CodeGen::CodeGenFunction::EmitCompoundStmtWithoutScope(clang::CompoundStmt const&, bool, clang::CodeGen::AggValueSlot) /llvm-project/clang/lib/CodeGen/CGStmt.cpp:518:3
#32 0x0000564466777c68 clang::CodeGen::CodeGenFunction::EmitFunctionBody(clang::Stmt const*) /llvm-project/clang/lib/CodeGen/CodeGenFunction.cpp:1307:5
#33 0x0000564466778b3e clang::CodeGen::CodeGenFunction::GenerateCode(clang::GlobalDecl, llvm::Function*, clang::CodeGen::CGFunctionInfo const&) /llvm-project/clang/lib/CodeGen/CodeGenFunction.cpp:1534:3
#34 0x000056446647e03b clang::CodeGen::CodeGenModule::EmitGlobalFunctionDefinition(clang::GlobalDecl, llvm::GlobalValue*) /llvm-project/clang/lib/CodeGen/CodeGenModule.cpp:5940:3
#35 0x0000564466474563 clang::CodeGen::CodeGenModule::EmitGlobalDefinition(clang::GlobalDecl, llvm::GlobalValue*) /llvm-project/clang/lib/CodeGen/CodeGenModule.cpp:0:9
#36 0x00005644664687f7 clang::CodeGen::CodeGenModule::EmitDeferred() /llvm-project/clang/lib/CodeGen/CodeGenModule.cpp:3202:5
#37 0x0000564466464aca clang::CodeGen::CodeGenModule::Release() /llvm-project/clang/lib/CodeGen/CodeGenModule.cpp:844:3
#38 0x0000564466fe9c08 (anonymous namespace)::CodeGeneratorImpl::HandleTranslationUnit(clang::ASTContext&) /llvm-project/clang/lib/CodeGen/ModuleBuilder.cpp:0:18
#39 0x0000564466fd8980 clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) /llvm-project/clang/lib/CodeGen/CodeGenAction.cpp:276:10
#40 0x000056446ab05609 clang::ParseAST(clang::Sema&, bool, bool) /llvm-project/clang/lib/Parse/ParseAST.cpp:183:12
#41 0x00005644675c4331 clang::ASTFrontendAction::ExecuteAction() /llvm-project/clang/lib/Frontend/FrontendAction.cpp:1194:1
#42 0x0000564466fdd086 clang::CodeGenAction::ExecuteAction() /llvm-project/clang/lib/CodeGen/CodeGenAction.cpp:1145:5
#43 0x00005644675c3d4c clang::FrontendAction::Execute() /llvm-project/clang/lib/Frontend/FrontendAction.cpp:1082:7
#44 0x00005644674e0359 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) /llvm-project/clang/lib/Frontend/CompilerInstance.cpp:1061:23
#45 0x00005644677a062e clang::ExecuteCompilerInvocation(clang::CompilerInstance*) /llvm-project/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:280:8
#46 0x00005644641b51c1 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) /llvm-project/clang/tools/driver/cc1_main.cpp:276:13
#47 0x00005644641a7b32 ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) /llvm-project/clang/tools/driver/driver.cpp:215:5
#48 0x00005644641a689b clang_main(int, char**, llvm::ToolContext const&) /llvm-project/clang/tools/driver/driver.cpp:256:5
#49 0x00005644641dc0f5 main /cmake-build-debug/tools/clang/tools/driver/clang-driver.cpp:17:3
#50 0x00007f3e401c6d90 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16
#51 0x00007f3e401c6e40 call_init ./csu/../csu/libc-start.c:128:20
#52 0x00007f3e401c6e40 __libc_start_main ./csu/../csu/libc-start.c:379:5
#53 0x00005644641a6325 _start (/cmake-build-debug/bin/clang-19+0x5b59325)
clang: error: unable to execute command: Aborted
clang: error: clang frontend command failed due to signal (use -v to see invocation)
clang version 19.0.0git (https://github.com/llvm/llvm-project.git 41a08e764aeec92703285754b5e8acd85283b1a6)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /cmake-build-debug/bin
Build config: +unoptimized, +assertions

This is valid even after CWG2881 because it publicly and unambiguously inherits from the lambda type.

For an invalid type, like int (*fptr)(int) = &lambda_type::operator()<int>;, I would expect a diagnosis even with -fsyntax-only, but there is no diagnosis and it crashes in the same way during codegen.

llvmbot commented 2 months ago

@llvm/issue-subscribers-clang-codegen

Author: Mital Ashok (MitalAshok)

https://godbolt.org/z/8Ma8Yz5x1 ```c++ inline auto get_lambda(int i) { return [i](this auto self) { return i; }; } using lambda_type = decltype(get_lambda(0)); struct derived : lambda_type {}; int (*fptr)(derived) = &lambda_type::operator()<derived>; ``` This crashes: ``` clang-19: /llvm-project/llvm/include/llvm/ADT/DenseMap.h:213: const ValueT &llvm::DenseMapBase<llvm::DenseMap<const clang::CXXMethodDecl *, llvm::SmallVector<clang::CXXBaseSpecifier *, 4>>, const clang::CXXMethodDecl *, llvm::SmallVector<clang::CXXBaseSpecifier *, 4>, llvm::DenseMapInfo<const clang::CXXMethodDecl *>, llvm::detail::DenseMapPair<const clang::CXXMethodDecl *, llvm::SmallVector<clang::CXXBaseSpecifier *, 4>>>::at(const_arg_type_t<KeyT>) const [DerivedT = llvm::DenseMap<const clang::CXXMethodDecl *, llvm::SmallVector<clang::CXXBaseSpecifier *, 4>>, KeyT = const clang::CXXMethodDecl *, ValueT = llvm::SmallVector<clang::CXXBaseSpecifier *, 4>, KeyInfoT = llvm::DenseMapInfo<const clang::CXXMethodDecl *>, BucketT = llvm::detail::DenseMapPair<const clang::CXXMethodDecl *, llvm::SmallVector<clang::CXXBaseSpecifier *, 4>>]: Assertion `Iter != this->end() && "DenseMap::at failed due to a missing key"' 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: /cmake-build-debug/bin/clang-19 -cc1 -triple x86_64-unknown-linux-gnu -emit-obj -dumpdir a- -disable-free -clear-ast-before-backend -main-file-name test.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/llvm-project -fcoverage-compilation-dir=/llvm-project -resource-dir /cmake-build-debug/lib/clang/19 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/x86_64-linux-gnu/c++/12 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/backward -internal-isystem /cmake-build-debug/lib/clang/19/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/12/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -std=c++26 -fdeprecated-macro -ferror-limit 19 -fgnuc-version=4.2.1 -fno-implicit-modules -fskip-odr-check-in-gmf -fcxx-exceptions -fexceptions -fcolor-diagnostics -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/-1c9dca.o -x c++ test.cpp 1. <eof> parser at end of file 2. Per-file LLVM IR generation 3. test.cpp:2:10: Generating code for declaration 'get_lambda(int)::(anonymous class)::operator()' #0 0x000056446608db8d llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /llvm-project/llvm/lib/Support/Unix/Signals.inc:723:11 #1 0x000056446608e07b PrintStackTraceSignalHandler(void*) /llvm-project/llvm/lib/Support/Unix/Signals.inc:798:1 #2 0x000056446608c0e6 llvm::sys::RunSignalHandlers() /llvm-project/llvm/lib/Support/Signals.cpp:105:5 #3 0x000056446608e835 SignalHandler(int) /llvm-project/llvm/lib/Support/Unix/Signals.inc:413:1 #4 0x00007f3e401df520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520) #5 0x00007f3e402339fc __pthread_kill_implementation ./nptl/pthread_kill.c:44:76 #6 0x00007f3e402339fc __pthread_kill_internal ./nptl/pthread_kill.c:78:10 #7 0x00007f3e402339fc pthread_kill ./nptl/pthread_kill.c:89:10 #8 0x00007f3e401df476 gsignal ./signal/../sysdeps/posix/raise.c:27:6 #9 0x00007f3e401c57f3 abort ./stdlib/abort.c:81:7 #10 0x00007f3e401c571b _nl_load_domain ./intl/loadmsgcat.c:1177:9 #11 0x00007f3e401d6e96 (/lib/x86_64-linux-gnu/libc.so.6+0x39e96) #12 0x0000564466889442 llvm::DenseMapBase<llvm::DenseMap<clang::CXXMethodDecl const*, llvm::SmallVector<clang::CXXBaseSpecifier*, 4u>, llvm::DenseMapInfo<clang::CXXMethodDecl const*, void>, llvm::detail::DenseMapPair<clang::CXXMethodDecl const*, llvm::SmallVector<clang::CXXBaseSpecifier*, 4u>>>, clang::CXXMethodDecl const*, llvm::SmallVector<clang::CXXBaseSpecifier*, 4u>, llvm::DenseMapInfo<clang::CXXMethodDecl const*, void>, llvm::detail::DenseMapPair<clang::CXXMethodDecl const*, llvm::SmallVector<clang::CXXBaseSpecifier*, 4u>>>::at(clang::CXXMethodDecl const*) const /llvm-project/llvm/include/llvm/ADT/DenseMap.h:214:12 #13 0x0000564466878c32 clang::CodeGen::CodeGenFunction::EmitLValueForLambdaField(clang::FieldDecl const*, llvm::Value*) /llvm-project/clang/lib/CodeGen/CGExpr.cpp:4713:26 #14 0x0000564466873dac EmitCapturedFieldLValue(clang::CodeGen::CodeGenFunction&, clang::FieldDecl const*, llvm::Value*) /llvm-project/clang/lib/CodeGen/CGExpr.cpp:2889:14 #15 0x000056446686043b clang::CodeGen::CodeGenFunction::EmitDeclRefLValue(clang::DeclRefExpr const*) /llvm-project/clang/lib/CodeGen/CGExpr.cpp:3022:9 #16 0x0000564466865ff0 clang::CodeGen::CodeGenFunction::EmitLValueHelper(clang::Expr const*, clang::CodeGen::KnownNonNull_t) /llvm-project/clang/lib/CodeGen/CGExpr.cpp:1549:12 #17 0x0000564466856e17 clang::CodeGen::CodeGenFunction::EmitLValue(clang::Expr const*, clang::CodeGen::KnownNonNull_t) /llvm-project/clang/lib/CodeGen/CGExpr.cpp:1502:7 #18 0x0000564466864165 clang::CodeGen::CodeGenFunction::EmitCheckedLValue(clang::Expr const*, clang::CodeGen::CodeGenFunction::TypeCheckKind) /llvm-project/clang/lib/CodeGen/CGExpr.cpp:1469:10 #19 0x00005644668afc6d (anonymous namespace)::ScalarExprEmitter::EmitCheckedLValue(clang::Expr const*, clang::CodeGen::CodeGenFunction::TypeCheckKind) /llvm-project/clang/lib/CodeGen/CGExprScalar.cpp:255:16 #20 0x00005644668afaf0 (anonymous namespace)::ScalarExprEmitter::EmitLoadOfLValue(clang::Expr const*) /llvm-project/clang/lib/CodeGen/CGExprScalar.cpp:304:33 #21 0x00005644668ac7e8 (anonymous namespace)::ScalarExprEmitter::VisitDeclRefExpr(clang::DeclRefExpr*) /llvm-project/clang/lib/CodeGen/CGExprScalar.cpp:524:5 #22 0x00005644668a4459 clang::StmtVisitorBase<std::add_pointer, (anonymous namespace)::ScalarExprEmitter, llvm::Value*>::Visit(clang::Stmt*) /cmake-build-debug/tools/clang/include/clang/AST/StmtNodes.inc:462:1 #23 0x0000564466899035 (anonymous namespace)::ScalarExprEmitter::Visit(clang::Expr*) /llvm-project/clang/lib/CodeGen/CGExprScalar.cpp:422:52 #24 0x00005644668b49ac (anonymous namespace)::ScalarExprEmitter::VisitCastExpr(clang::CastExpr*) /llvm-project/clang/lib/CodeGen/CGExprScalar.cpp:2505:5 #25 0x00005644668ad3ed clang::StmtVisitorBase<std::add_pointer, (anonymous namespace)::ScalarExprEmitter, llvm::Value*>::VisitImplicitCastExpr(clang::ImplicitCastExpr*) /cmake-build-debug/tools/clang/include/clang/AST/StmtNodes.inc:522:1 #26 0x00005644668a4509 clang::StmtVisitorBase<std::add_pointer, (anonymous namespace)::ScalarExprEmitter, llvm::Value*>::Visit(clang::Stmt*) /cmake-build-debug/tools/clang/include/clang/AST/StmtNodes.inc:522:1 #27 0x0000564466899035 (anonymous namespace)::ScalarExprEmitter::Visit(clang::Expr*) /llvm-project/clang/lib/CodeGen/CGExprScalar.cpp:422:52 #28 0x0000564466898e5a clang::CodeGen::CodeGenFunction::EmitScalarExpr(clang::Expr const*, bool) /llvm-project/clang/lib/CodeGen/CGExprScalar.cpp:5490:3 #29 0x00005644667a6485 clang::CodeGen::CodeGenFunction::EmitReturnStmt(clang::ReturnStmt const&) /llvm-project/clang/lib/CodeGen/CGStmt.cpp:1541:27 #30 0x00005644667a2c01 clang::CodeGen::CodeGenFunction::EmitStmt(clang::Stmt const*, llvm::ArrayRef<clang::Attr const*>) /llvm-project/clang/lib/CodeGen/CGStmt.cpp:160:75 #31 0x00005644667ac9c4 clang::CodeGen::CodeGenFunction::EmitCompoundStmtWithoutScope(clang::CompoundStmt const&, bool, clang::CodeGen::AggValueSlot) /llvm-project/clang/lib/CodeGen/CGStmt.cpp:518:3 #32 0x0000564466777c68 clang::CodeGen::CodeGenFunction::EmitFunctionBody(clang::Stmt const*) /llvm-project/clang/lib/CodeGen/CodeGenFunction.cpp:1307:5 #33 0x0000564466778b3e clang::CodeGen::CodeGenFunction::GenerateCode(clang::GlobalDecl, llvm::Function*, clang::CodeGen::CGFunctionInfo const&) /llvm-project/clang/lib/CodeGen/CodeGenFunction.cpp:1534:3 #34 0x000056446647e03b clang::CodeGen::CodeGenModule::EmitGlobalFunctionDefinition(clang::GlobalDecl, llvm::GlobalValue*) /llvm-project/clang/lib/CodeGen/CodeGenModule.cpp:5940:3 #35 0x0000564466474563 clang::CodeGen::CodeGenModule::EmitGlobalDefinition(clang::GlobalDecl, llvm::GlobalValue*) /llvm-project/clang/lib/CodeGen/CodeGenModule.cpp:0:9 #36 0x00005644664687f7 clang::CodeGen::CodeGenModule::EmitDeferred() /llvm-project/clang/lib/CodeGen/CodeGenModule.cpp:3202:5 #37 0x0000564466464aca clang::CodeGen::CodeGenModule::Release() /llvm-project/clang/lib/CodeGen/CodeGenModule.cpp:844:3 #38 0x0000564466fe9c08 (anonymous namespace)::CodeGeneratorImpl::HandleTranslationUnit(clang::ASTContext&) /llvm-project/clang/lib/CodeGen/ModuleBuilder.cpp:0:18 #39 0x0000564466fd8980 clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) /llvm-project/clang/lib/CodeGen/CodeGenAction.cpp:276:10 #40 0x000056446ab05609 clang::ParseAST(clang::Sema&, bool, bool) /llvm-project/clang/lib/Parse/ParseAST.cpp:183:12 #41 0x00005644675c4331 clang::ASTFrontendAction::ExecuteAction() /llvm-project/clang/lib/Frontend/FrontendAction.cpp:1194:1 #42 0x0000564466fdd086 clang::CodeGenAction::ExecuteAction() /llvm-project/clang/lib/CodeGen/CodeGenAction.cpp:1145:5 #43 0x00005644675c3d4c clang::FrontendAction::Execute() /llvm-project/clang/lib/Frontend/FrontendAction.cpp:1082:7 #44 0x00005644674e0359 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) /llvm-project/clang/lib/Frontend/CompilerInstance.cpp:1061:23 #45 0x00005644677a062e clang::ExecuteCompilerInvocation(clang::CompilerInstance*) /llvm-project/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:280:8 #46 0x00005644641b51c1 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) /llvm-project/clang/tools/driver/cc1_main.cpp:276:13 #47 0x00005644641a7b32 ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) /llvm-project/clang/tools/driver/driver.cpp:215:5 #48 0x00005644641a689b clang_main(int, char**, llvm::ToolContext const&) /llvm-project/clang/tools/driver/driver.cpp:256:5 #49 0x00005644641dc0f5 main /cmake-build-debug/tools/clang/tools/driver/clang-driver.cpp:17:3 #50 0x00007f3e401c6d90 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16 #51 0x00007f3e401c6e40 call_init ./csu/../csu/libc-start.c:128:20 #52 0x00007f3e401c6e40 __libc_start_main ./csu/../csu/libc-start.c:379:5 #53 0x00005644641a6325 _start (/cmake-build-debug/bin/clang-19+0x5b59325) clang: error: unable to execute command: Aborted clang: error: clang frontend command failed due to signal (use -v to see invocation) clang version 19.0.0git (https://github.com/llvm/llvm-project.git 41a08e764aeec92703285754b5e8acd85283b1a6) Target: x86_64-unknown-linux-gnu Thread model: posix InstalledDir: /cmake-build-debug/bin Build config: +unoptimized, +assertions ``` This is valid even after [CWG2881](https://cplusplus.github.io/CWG/issues/2881.html) because it publicly and unambiguously inherits from the lambda type. For an invalid type, like `int (*fptr)(int) = &lambda_type::operator()<int>;`, I would expect a diagnosis even with `-fsyntax-only`, but there is no diagnosis and it crashes in the same way during codegen.