Open
Description
will working on the clang test suite clang/test/CodeGenObjCXX/lambda-expressions.mm
i got a compiler segfault when compiling it with the default driver:
clang lambda-expressions.mm -fblocks
i narrowed it down to using an Objective-C super
call inside a C++ lambda on the GCC runtime path and with the verifier disabled:
clang -cc1 \
-disable-llvm-verifier \
-fobjc-runtime=gcc \
-emit-obj lambda-expressions.mm
source file:
template <class T> void take_lambda(T &&lambda) { lambda(); }
@interface A
- (void)test;
@end
@interface B : A
@end
@implementation B
- (void)test {
take_lambda([=] { [super test]; });
}
@end
environment:
clang version 20.1.6
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-pc-linux-gnu/15.1.1
Found candidate GCC installation: /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.1.1
Selected GCC installation: /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.1.1
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Selected multilib: .;@m64
Expected behavior
Aliasee cannot be NULL!
ptr @.objc_class_refB
fatal error: error in backend: Broken module found, compilation aborted!
stack trace
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: clang -cc1 test_lambda_segfault.mm -disable-llvm-verifier -fobjc-runtime=gcc -emit-obj
1. <eof> parser at end of file
2. Code generation
3. Running pass 'Function Pass Manager' on module 'test_lambda_segfault.mm'.
4. Running pass 'X86 DAG->DAG Instruction Selection' on function '@"_ZZ10_i_B__testENK3$_0clEv"'
#0 0x00007fabab2ea01d llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /usr/src/debug/llvm/llvm-20.1.6.src/lib/Support/Unix/Signals.inc:799:22
#1 0x00007fabab2e7647 llvm::sys::RunSignalHandlers() /usr/src/debug/llvm/llvm-20.1.6.src/lib/Support/Signals.cpp:105:20
#2 0x00007fabab2e7647 SignalHandler /usr/src/debug/llvm/llvm-20.1.6.src/lib/Support/Unix/Signals.inc:405:31
#3 0x00007fabaa44def0 (/usr/lib/libc.so.6+0x3def0)
#4 0x00007fabab4639d6 llvm::Value::getValueID() const /usr/src/debug/llvm/llvm-20.1.6.src/include/llvm/IR/Value.h:533:12
#5 0x00007fabab4639d6 llvm::GlobalObject::classof(llvm::Value const*) /usr/src/debug/llvm/llvm-20.1.6.src/include/llvm/IR/GlobalObject.h:161:25
#6 0x00007fabab4639d6 llvm::isa_impl<llvm::GlobalObject, llvm::Constant, void>::doit(llvm::Constant const&) /usr/src/debug/llvm/llvm-20.1.6.src/include/llvm/Support/Casting.h:64:64
#7 0x00007fabab4639d6 llvm::isa_impl_cl<llvm::GlobalObject, llvm::Constant const*>::doit(llvm::Constant const*) /usr/src/debug/llvm/llvm-20.1.6.src/include/llvm/Support/Casting.h:110:36
#8 0x00007fabab4639d6 llvm::isa_impl_wrap<llvm::GlobalObject, llvm::Constant const*, llvm::Constant const*>::doit(llvm::Constant const* const&) /usr/src/debug/llvm/llvm-20.1.6.src/include/llvm/Support/Casting.h:137:41
#9 0x00007fabab4639d6 llvm::isa_impl_wrap<llvm::GlobalObject, llvm::Constant const* const, llvm::Constant const*>::doit(llvm::Constant const* const&) /usr/src/debug/llvm/llvm-20.1.6.src/include/llvm/Support/Casting.h:129:13
#10 0x00007fabab4639d6 llvm::CastIsPossible<llvm::GlobalObject, llvm::Constant const*, void>::isPossible(llvm::Constant const* const&) /usr/src/debug/llvm/llvm-20.1.6.src/include/llvm/Support/Casting.h:257:62
#11 0x00007fabab4639d6 llvm::CastInfo<llvm::GlobalObject, llvm::Constant const*, void>::doCastIfPossible(llvm::Constant const* const&) /usr/src/debug/llvm/llvm-20.1.6.src/include/llvm/Support/Casting.h:493:26
#12 0x00007fabab4639d6 decltype(auto) llvm::dyn_cast<llvm::GlobalObject, llvm::Constant const>(llvm::Constant const*) /usr/src/debug/llvm/llvm-20.1.6.src/include/llvm/Support/Casting.h:663:48
#13 0x00007fabab4639d6 findBaseObject<llvm::GlobalValue::getAliaseeObject() const::<lambda(const llvm::GlobalValue&)> > /usr/src/debug/llvm/llvm-20.1.6.src/lib/IR/Globals.cpp:365:40
#14 0x00007fabab469f6b llvm::DenseMap<llvm::GlobalAlias const*, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<llvm::GlobalAlias const*, void>, llvm::detail::DenseSetPair<llvm::GlobalAlias const*>>::~DenseMap() /usr/src/debug/llvm/llvm-20.1.6.src/include/llvm/ADT/DenseMap.h:766:50
#15 0x00007fabab469f6b llvm::detail::DenseSetImpl<llvm::GlobalAlias const*, llvm::DenseMap<llvm::GlobalAlias const*, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<llvm::GlobalAlias const*, void>, llvm::detail::DenseSetPair<llvm::GlobalAlias const*>>, llvm::DenseMapInfo<llvm::GlobalAlias const*, void>>::~DenseSetImpl() /usr/src/debug/llvm/llvm-20.1.6.src/include/llvm/ADT/DenseSet.h:54:7
#16 0x00007fabab469f6b llvm::DenseSet<llvm::GlobalAlias const*, llvm::DenseMapInfo<llvm::GlobalAlias const*, void>>::~DenseSet() /usr/src/debug/llvm/llvm-20.1.6.src/include/llvm/ADT/DenseSet.h:274:7
#17 0x00007fabab469f6b llvm::GlobalValue::getAliaseeObject() const /usr/src/debug/llvm/llvm-20.1.6.src/lib/IR/Globals.cpp:403:1
#18 0x00007fabae210fbd llvm::TargetMachine::isLargeGlobalValue(llvm::GlobalValue const*) const /usr/src/debug/llvm/llvm-20.1.6.src/lib/Target/TargetMachine.cpp:56:3
#19 0x00007fabafe17d4b handleConstantAddresses /usr/src/debug/llvm/llvm-20.1.6.src/lib/Target/X86/X86FastISel.cpp:718:5
#20 0x00007fabafe18486 llvm::SmallVectorTemplateCommon<llvm::Value const*, void>::isSmall() const /usr/src/debug/llvm/llvm-20.1.6.src/include/llvm/ADT/SmallVector.h:143:39
#21 0x00007fabafe18486 llvm::SmallVectorImpl<llvm::Value const*>::~SmallVectorImpl() /usr/src/debug/llvm/llvm-20.1.6.src/include/llvm/ADT/SmallVector.h:603:23
#22 0x00007fabafe18486 llvm::SmallVector<llvm::Value const*, 32u>::~SmallVector() /usr/src/debug/llvm/llvm-20.1.6.src/include/llvm/ADT/SmallVector.h:1203:3
#23 0x00007fabafe18486 X86SelectAddress /usr/src/debug/llvm/llvm-20.1.6.src/lib/Target/X86/X86FastISel.cpp:986:1
#24 0x00007fabafe18ef5 llvm::SmallVectorTemplateCommon<llvm::Value const*, void>::begin() /usr/src/debug/llvm/llvm-20.1.6.src/include/llvm/ADT/SmallVector.h:267:45
#25 0x00007fabafe18ef5 llvm::SmallVectorTemplateCommon<llvm::Value const*, void>::rend() /usr/src/debug/llvm/llvm-20.1.6.src/include/llvm/ADT/SmallVector.h:275:73
#26 0x00007fabafe18ef5 decltype(fp.rend()) std::rend<llvm::SmallVector<llvm::Value const*, 32u>>(llvm::SmallVector<llvm::Value const*, 32u>&) /usr/include/c++/15.1.1/bits/range_access.h:182:26
#27 0x00007fabafe18ef5 decltype(rend(forward<llvm::SmallVector<llvm::Value const*, 32u>&>(fp))) llvm::adl_detail::rend_impl<llvm::SmallVector<llvm::Value const*, 32u>&>(llvm::SmallVector<llvm::Value const*, 32u>&) /usr/src/debug/llvm/llvm-20.1.6.src/include/llvm/ADT/ADL.h:53:42
#28 0x00007fabafe18ef5 decltype(rend_impl(forward<llvm::SmallVector<llvm::Value const*, 32u>&>(fp))) llvm::adl_rend<llvm::SmallVector<llvm::Value const*, 32u>&>(llvm::SmallVector<llvm::Value const*, 32u>&) /usr/src/debug/llvm/llvm-20.1.6.src/include/llvm/ADT/ADL.h:104:59
#29 0x00007fabafe18ef5 auto llvm::reverse<llvm::SmallVector<llvm::Value const*, 32u>&>(llvm::SmallVector<llvm::Value const*, 32u>&) /usr/src/debug/llvm/llvm-20.1.6.src/include/llvm/ADT/STLExtras.h:422:46
#30 0x00007fabafe18ef5 X86SelectAddress /usr/src/debug/llvm/llvm-20.1.6.src/lib/Target/X86/X86FastISel.cpp:974:39
#31 0x00007fabafe201ad X86SelectLoad /usr/src/debug/llvm/llvm-20.1.6.src/lib/Target/X86/X86FastISel.cpp:1345:3
#32 0x00007fabafe201ad fastSelectInstruction /usr/src/debug/llvm/llvm-20.1.6.src/lib/Target/X86/X86FastISel.cpp:3642:25
#33 0x00007fababde2479 llvm::FastISel::selectInstruction(llvm::Instruction const*) /usr/src/debug/llvm/llvm-20.1.6.src/lib/CodeGen/SelectionDAG/FastISel.cpp:1646:3
#34 0x00007fabac012b41 llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) /usr/src/debug/llvm/llvm-20.1.6.src/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1774:9
#35 0x00007fabac0147a4 llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) /usr/src/debug/llvm/llvm-20.1.6.src/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:616:22
#36 0x00007fabac00270b llvm::OptLevelChanger::~OptLevelChanger() /usr/src/debug/llvm/llvm-20.1.6.src/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:269:7
#37 0x00007fabac00270b llvm::SelectionDAGISelLegacy::runOnMachineFunction(llvm::MachineFunction&) /usr/src/debug/llvm/llvm-20.1.6.src/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:376:1
#38 0x00007fabac00270b llvm::SelectionDAGISelLegacy::runOnMachineFunction(llvm::MachineFunction&) /usr/src/debug/llvm/llvm-20.1.6.src/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:347:6
#39 0x00007fabab8d28ff llvm::MachineFunctionPass::runOnFunction(llvm::Function&) /usr/src/debug/llvm/llvm-20.1.6.src/lib/CodeGen/MachineFunctionPass.cpp:94:33
#40 0x00007fabab4d0fa3 llvm::FPPassManager::runOnFunction(llvm::Function&) /usr/src/debug/llvm/llvm-20.1.6.src/lib/IR/LegacyPassManager.cpp:1406:40
#41 0x00007fabab4d1183 llvm::ilist_detail::node_base_prevnext<llvm::ilist_node_base<false, void>, false>::getNext() const /usr/src/debug/llvm/llvm-20.1.6.src/include/llvm/ADT/ilist_node_base.h:28:38
#42 0x00007fabab4d1183 llvm::ilist_node_impl<llvm::ilist_detail::node_options<llvm::Function, false, false, void, false, void>>::getNext() /usr/src/debug/llvm/llvm-20.1.6.src/include/llvm/ADT/ilist_node.h:117:66
#43 0x00007fabab4d1183 llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Function, false, false, void, false, void>, false, false>::operator++() /usr/src/debug/llvm/llvm-20.1.6.src/include/llvm/ADT/ilist_iterator.h:187:25
#44 0x00007fabab4d1183 llvm::FPPassManager::runOnModule(llvm::Module&) /usr/src/debug/llvm/llvm-20.1.6.src/lib/IR/LegacyPassManager.cpp:1451:22
#45 0x00007fabab4d0382 runOnModule /usr/src/debug/llvm/llvm-20.1.6.src/lib/IR/LegacyPassManager.cpp:1521:38
#46 0x00007fabab4d0382 llvm::legacy::PassManagerImpl::run(llvm::Module&) /usr/src/debug/llvm/llvm-20.1.6.src/lib/IR/LegacyPassManager.cpp:539:55
#47 0x00007fabb5cfd122 RunCodegenPipeline /usr/src/debug/clang/clang-20.1.6.src/lib/CodeGen/BackendUtil.cpp:1229:9
#48 0x00007fabb5cfd122 emitAssembly /usr/src/debug/clang/clang-20.1.6.src/lib/CodeGen/BackendUtil.cpp:1252:21
#49 0x00007fabb5cfd122 clang::emitBackendOutput(clang::CompilerInstance&, clang::CodeGenOptions&, llvm::StringRef, llvm::Module*, clang::BackendAction, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream>>, clang::BackendConsumer*) /usr/src/debug/clang/clang-20.1.6.src/lib/CodeGen/BackendUtil.cpp:1416:25
#50 0x00007fabb61478fd llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>::release() /usr/include/llvm/ADT/IntrusiveRefCntPtr.h:232:9
#51 0x00007fabb61478fd llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>::~IntrusiveRefCntPtr() /usr/include/llvm/ADT/IntrusiveRefCntPtr.h:196:34
#52 0x00007fabb61478fd clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) /usr/src/debug/clang/clang-20.1.6.src/lib/CodeGen/CodeGenAction.cpp:315:20
#53 0x00007fabb4907516 __gnu_cxx::__normal_iterator<std::unique_ptr<clang::TemplateInstantiationCallback, std::default_delete<clang::TemplateInstantiationCallback>>*, std::vector<std::unique_ptr<clang::TemplateInstantiationCallback, std::default_delete<clang::TemplateInstantiationCallback>>, std::allocator<std::unique_ptr<clang::TemplateInstantiationCallback, std::default_delete<clang::TemplateInstantiationCallback>>>>>::__normal_iterator(std::unique_ptr<clang::TemplateInstantiationCallback, std::default_delete<clang::TemplateInstantiationCallback>>* const&) /usr/include/c++/15.1.1/bits/stl_iterator.h:1059:9
#54 0x00007fabb4907516 std::vector<std::unique_ptr<clang::TemplateInstantiationCallback, std::default_delete<clang::TemplateInstantiationCallback>>, std::allocator<std::unique_ptr<clang::TemplateInstantiationCallback, std::default_delete<clang::TemplateInstantiationCallback>>>>::begin() /usr/include/c++/15.1.1/bits/stl_vector.h:999:16
#55 0x00007fabb4907516 void clang::finalize<std::vector<std::unique_ptr<clang::TemplateInstantiationCallback, std::default_delete<clang::TemplateInstantiationCallback>>, std::allocator<std::unique_ptr<clang::TemplateInstantiationCallback, std::default_delete<clang::TemplateInstantiationCallback>>>>>(std::vector<std::unique_ptr<clang::TemplateInstantiationCallback, std::default_delete<clang::TemplateInstantiationCallback>>, std::allocator<std::unique_ptr<clang::TemplateInstantiationCallback, std::default_delete<clang::TemplateInstantiationCallback>>>>&, clang::Sema const&) /usr/src/debug/clang/clang-20.1.6.src/include/clang/Sema/TemplateInstCallback.h:54:3
#56 0x00007fabb4907516 clang::ParseAST(clang::Sema&, bool, bool) /usr/src/debug/clang/clang-20.1.6.src/lib/Parse/ParseAST.cpp:191:11
#57 0x00007fabb6a9f1bc clang::CompilerInstance::shouldBuildGlobalModuleIndex() const /usr/src/debug/clang/clang-20.1.6.src/lib/Frontend/CompilerInstance.cpp:88:58
#58 0x00007fabb6a9f1bc clang::FrontendAction::Execute() /usr/src/debug/clang/clang-20.1.6.src/lib/Frontend/FrontendAction.cpp:1076:38
#59 0x00007fabb6a25bd7 llvm::Error::getPtr() const /usr/include/llvm/Support/Error.h:282:12
#60 0x00007fabb6a25bd7 llvm::Error::operator bool() /usr/include/llvm/Support/Error.h:242:22
#61 0x00007fabb6a25bd7 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) /usr/src/debug/clang/clang-20.1.6.src/lib/Frontend/CompilerInstance.cpp:1056:42
#62 0x00007fabb6b073af std::__shared_ptr<clang::FrontendOptions, (__gnu_cxx::_Lock_policy)2>::get() const /usr/include/c++/15.1.1/bits/shared_ptr_base.h:1673:16
#63 0x00007fabb6b073af std::__shared_ptr_access<clang::FrontendOptions, (__gnu_cxx::_Lock_policy)2, false, false>::_M_get() const /usr/include/c++/15.1.1/bits/shared_ptr_base.h:1370:69
#64 0x00007fabb6b073af std::__shared_ptr_access<clang::FrontendOptions, (__gnu_cxx::_Lock_policy)2, false, false>::operator*() const /usr/include/c++/15.1.1/bits/shared_ptr_base.h:1358:40
#65 0x00007fabb6b073af clang::CompilerInvocation::getFrontendOpts() /usr/src/debug/clang/clang-20.1.6.src/include/clang/Frontend/CompilerInvocation.h:259:48
#66 0x00007fabb6b073af clang::CompilerInstance::getFrontendOpts() /usr/src/debug/clang/clang-20.1.6.src/include/clang/Frontend/CompilerInstance.h:313:39
#67 0x00007fabb6b073af clang::ExecuteCompilerInvocation(clang::CompilerInstance*) /usr/src/debug/clang/clang-20.1.6.src/lib/FrontendTool/ExecuteCompilerInvocation.cpp:297:29
#68 0x000055db43c61a03 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) /usr/src/debug/clang/clang-20.1.6.src/tools/driver/cc1_main.cpp:290:40
#69 0x000055db43c65781 ExecuteCC1Tool /usr/src/debug/clang/clang-20.1.6.src/tools/driver/driver.cpp:218:20
#70 0x000055db43c6723a clang_main(int, char**, llvm::ToolContext const&) /usr/src/debug/clang/clang-20.1.6.src/tools/driver/driver.cpp:259:26
#71 0x000055db43c581e0 main /usr/src/debug/clang/clang-20.1.6.src/build/tools/driver/clang-driver.cpp:18:1
#72 0x00007fabaa4376b5 __libc_start_call_main /usr/src/debug/glibc/glibc/csu/../sysdeps/nptl/libc_start_call_main.h:74:3
#73 0x00007fabaa437769 call_init /usr/src/debug/glibc/glibc/csu/../csu/libc-start.c:128:20
#74 0x00007fabaa437769 __libc_start_main /usr/src/debug/glibc/glibc/csu/../csu/libc-start.c:347:5
#75 0x000055db43c58245 _start (/usr/bin/clang-20+0xb245)
[1] 835488 segmentation fault (core dumped) clang -cc1 test_lambda_segfault.mm "-disable-llvm-verifier" -emit-obj