bloomberg/clang-p2996

Crash when expanding over members_of

Closed this issue · 1 comments

Describe the bug

First of all: Thank you for the amazing work you did here.
Consider this minimal example code:

#include <experimental/meta>
#include <vector>

namespace __impl {
  template<auto... vals>
  struct replicator_type {
    template<typename F>
      constexpr void operator>>(F body) const {
        (body.template operator()<vals>(), ...);
      }
  };

  template<auto... vals>
  replicator_type<vals...> replicator = {};
}

template<typename R>
consteval auto expand(R range) {
  std::vector<std::meta::info> args;
  for (auto r : range) {
    args.push_back(std::meta::reflect_result(r));
  }
  return std::meta::substitute(^__impl::replicator, args);
}

class simple_test_class {
public:
    int a;

    void f() {

    }
};

template<typename T>
constexpr void create_function_member_information() {
    std::vector<int> result;
    [:expand(std::meta::members_of(^T)):] >> [&]<auto e> {
    };

}

int main() {
    create_function_member_information<simple_test_class>();

    return 0;
}

Compiling this with the latest checkout of this compiler results in a crash:

> build] clang++: /mnt/d/code/clang-p2996/clang/include/clang/AST/GlobalDecl.h:62: void clang::GlobalDecl::Init(const clang::Decl*): Assertion `!isa<CXXDestructorDecl>(D) && "Use other ctor with dtor decls!"' failed.
> [build] PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
> [build] Stack dump:
> [build] 0.	Program arguments: /mnt/d/code/clang-p2996-build/bin/clang++ -Wall -Wextra -fexpansion-statements -nostdinc++ -nostdlib++ -isystem /mnt/d/code/clang-p2996-build/include/c++/v1 -isystem /mnt/d/code/clang-p2996-build/include/x86_64-unknown-linux-gnu/c++/v1/ -freflection -Wall -Wextra -g -std=gnu++26 -MD -MT CMakeFiles/runtime_reflection.dir/main.cpp.o -MF CMakeFiles/runtime_reflection.dir/main.cpp.o.d -o CMakeFiles/runtime_reflection.dir/main.cpp.o -c /mnt/d/code/runtime_reflection/main.cpp
> [build] 1.	/mnt/d/code/runtime_reflection/main.cpp:94:59: current parser token ')'
> [build] 2.	/mnt/d/code/runtime_reflection/main.cpp:93:12: parsing function body 'main'
> [build] 3.	/mnt/d/code/runtime_reflection/main.cpp:93:12: in compound statement ('{}')
> [build] 4.	/mnt/d/code/runtime_reflection/main.cpp:86:16: instantiating function definition 'create_function_member_information<simple_test_class>'
> [build] 5.	/mnt/d/code/runtime_reflection/main.cpp:58:22: instantiating function definition '__impl::replicator_type<(reflection), (reflection), (reflection), (reflection), (reflection), (reflection), (reflection), (reflection)>::operator>><(lambda at /mnt/d/code/runtime_reflection/main.cpp:88:46)>'
> [build] 6.	/mnt/d/code/runtime_reflection/main.cpp:88:46: instantiating function definition 'create_function_member_information()::(anonymous class)::operator()<(reflection)>'
> [build] 7.	/mnt/d/code/runtime_reflection/main.cpp:88:46: LLVM IR generation of declaration 'create_function_member_information()::(anonymous class)::operator()'
> [build] 8.	/mnt/d/code/runtime_reflection/main.cpp:88:46: Mangling declaration 'create_function_member_information()::(anonymous class)::operator()'
> [build]   #0 0x00007fc6ae070cdc llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /mnt/d/code/clang-p2996/llvm/lib/Support/Unix/Signals.inc:723:22
> [build]   #1 0x00007fc6ae0710fd PrintStackTraceSignalHandler(void*) /mnt/d/code/clang-p2996/llvm/lib/Support/Unix/Signals.inc:798:1
> [build]   #2 0x00007fc6ae06e54d llvm::sys::RunSignalHandlers() /mnt/d/code/clang-p2996/llvm/lib/Support/Signals.cpp:105:20
> [build]   #3 0x00007fc6ae07043d llvm::sys::CleanupOnSignal(unsigned long) /mnt/d/code/clang-p2996/llvm/lib/Support/Unix/Signals.inc:367:31
> [build]   #4 0x00007fc6adf97216 (anonymous namespace)::CrashRecoveryContextImpl::HandleCrash(int, unsigned long) /mnt/d/code/clang-p2996/llvm/lib/Support/CrashRecoveryContext.cpp:73:5
> [build]   #5 0x00007fc6adf97742 CrashRecoverySignalHandler(int) /mnt/d/code/clang-p2996/llvm/lib/Support/CrashRecoveryContext.cpp:391:1
> [build]   #6 0x00007fc6a8422520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
> [build]   #7 0x00007fc6a84769fc __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
> [build]   #8 0x00007fc6a84769fc __pthread_kill_internal ./nptl/pthread_kill.c:78:10
> [build]   #9 0x00007fc6a84769fc pthread_kill ./nptl/pthread_kill.c:89:10
> [build]  #10 0x00007fc6a8422476 gsignal ./signal/../sysdeps/posix/raise.c:27:6
> [build]  #11 0x00007fc6a84087f3 abort ./stdlib/abort.c:81:7
> [build]  #12 0x00007fc6a840871b _nl_load_domain ./intl/loadmsgcat.c:1177:9
> [build]  #13 0x00007fc6a8419e96 (/lib/x86_64-linux-gnu/libc.so.6+0x39e96)
> [build]  #14 0x00007fc6ae3f9572 clang::GlobalDecl::Init(clang::Decl const*) /mnt/d/code/clang-p2996/clang/include/clang/AST/GlobalDecl.h:63:5
> [build]  #15 0x00007fc6ae604424 clang::GlobalDecl::GlobalDecl(clang::NamedDecl const*) /mnt/d/code/clang-p2996/clang/include/clang/AST/GlobalDecl.h:83:45
> [build]  #16 0x00007fc6b497da63 (anonymous namespace)::CXXNameMangler::mangleReflection(clang::ReflectionValue const&) /mnt/d/code/clang-p2996/clang/lib/AST/ItaniumMangle.cpp:4698:13
> [build]  #17 0x00007fc6b498338e (anonymous namespace)::CXXNameMangler::mangleTemplateArg(clang::TemplateArgument, bool) /mnt/d/code/clang-p2996/clang/lib/AST/ItaniumMangle.cpp:6211:5
> [build]  #18 0x00007fc6b498316d (anonymous namespace)::CXXNameMangler::mangleTemplateArg((anonymous namespace)::CXXNameMangler::TemplateArgManglingInfo&, unsigned int, clang::TemplateArgument) /mnt/d/code/clang-p2996/clang/lib/AST/ItaniumMangle.cpp:6175:20
> [build]  #19 0x00007fc6b4982f76 (anonymous namespace)::CXXNameMangler::mangleTemplateArgs(clang::TemplateName, clang::TemplateArgumentList const&) /mnt/d/code/clang-p2996/clang/lib/AST/ItaniumMangle.cpp:6141:22
> [build]  #20 0x00007fc6b4967ffd (anonymous namespace)::CXXNameMangler::mangleNestedName(clang::GlobalDecl, clang::DeclContext const*, llvm::SmallVector<llvm::StringRef, 4u> const*, bool) /mnt/d/code/clang-p2996/clang/lib/AST/ItaniumMangle.cpp:1816:23
> [build]  #21 0x00007fc6b49687c0 (anonymous namespace)::CXXNameMangler::mangleLocalName(clang::GlobalDecl, llvm::SmallVector<llvm::StringRef, 4u> const*) /mnt/d/code/clang-p2996/clang/lib/AST/ItaniumMangle.cpp:1936:23
> [build]  #22 0x00007fc6b4965823 (anonymous namespace)::CXXNameMangler::mangleNameWithAbiTags(clang::GlobalDecl, llvm::SmallVector<llvm::StringRef, 4u> const*) /mnt/d/code/clang-p2996/clang/lib/AST/ItaniumMangle.cpp:1081:5
> [build]  #23 0x00007fc6b49655e1 (anonymous namespace)::CXXNameMangler::mangleName(clang::GlobalDecl) /mnt/d/code/clang-p2996/clang/lib/AST/ItaniumMangle.cpp:1047:1
> [build]  #24 0x00007fc6b49649ed (anonymous namespace)::CXXNameMangler::mangleFunctionEncoding(clang::GlobalDecl) /mnt/d/code/clang-p2996/clang/lib/AST/ItaniumMangle.cpp:859:26
> [build]  #25 0x00007fc6b4964808 (anonymous namespace)::CXXNameMangler::mangle(clang::GlobalDecl) /mnt/d/code/clang-p2996/clang/lib/AST/ItaniumMangle.cpp:835:1
> [build]  #26 0x00007fc6b4987803 (anonymous namespace)::ItaniumMangleContextImpl::mangleCXXName(clang::GlobalDecl, llvm::raw_ostream&) /mnt/d/code/clang-p2996/clang/lib/AST/ItaniumMangle.cpp:7179:1
> [build]  #27 0x00007fc6b49bb1c6 clang::MangleContext::mangleName(clang::GlobalDecl, llvm::raw_ostream&) /mnt/d/code/clang-p2996/clang/lib/AST/Mangle.cpp:193:5
> [build]  #28 0x00007fc6ae71d047 getMangledNameImpl(clang::CodeGen::CodeGenModule&, clang::GlobalDecl, clang::NamedDecl const*, bool) /mnt/d/code/clang-p2996/clang/lib/CodeGen/CodeGenModule.cpp:1811:18
> [build]  #29 0x00007fc6ae71dd6e clang::CodeGen::CodeGenModule::getMangledName(clang::GlobalDecl) /mnt/d/code/clang-p2996/clang/lib/CodeGen/CodeGenModule.cpp:1969:3
> [build]  #30 0x00007fc6ae7282f8 clang::CodeGen::CodeGenModule::EmitGlobal(clang::GlobalDecl) /mnt/d/code/clang-p2996/clang/lib/CodeGen/CodeGenModule.cpp:3832:41
> [build]  #31 0x00007fc6ae736327 clang::CodeGen::CodeGenModule::EmitTopLevelDecl(clang::Decl*) /mnt/d/code/clang-p2996/clang/lib/CodeGen/CodeGenModule.cpp:6807:37
> [build]  #32 0x00007fc6aeea481a (anonymous namespace)::CodeGeneratorImpl::HandleTopLevelDecl(clang::DeclGroupRef) /mnt/d/code/clang-p2996/clang/lib/CodeGen/ModuleBuilder.cpp:189:7
> [build]  #33 0x00007fc6aee906cd clang::BackendConsumer::HandleTopLevelDecl(clang::DeclGroupRef) /mnt/d/code/clang-p2996/clang/lib/CodeGen/CodeGenAction.cpp:201:7
> [build]  #34 0x00007fc6b3a710e3 clang::Sema::InstantiateFunctionDefinition(clang::SourceLocation, clang::FunctionDecl*, bool, bool, bool) /mnt/d/code/clang-p2996/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp:5273:30
> [build]  #35 0x00007fc6b38e7e97 clang::Sema::DeduceReturnType(clang::FunctionDecl*, clang::SourceLocation, bool)::'lambda0'()::operator()() const /mnt/d/code/clang-p2996/clang/lib/Sema/SemaTemplateDeduction.cpp:5509:5
> [build]  #36 0x00007fc6b38fc5d3 void llvm::function_ref<void ()>::callback_fn<clang::Sema::DeduceReturnType(clang::FunctionDecl*, clang::SourceLocation, bool)::'lambda0'()>(long) /mnt/d/code/clang-p2996/llvm/include/llvm/ADT/STLFunctionalExtras.h:46:40
> [build]  #37 0x00007fc6acba13a6 llvm::function_ref<void ()>::operator()() const /mnt/d/code/clang-p2996/llvm/include/llvm/ADT/STLFunctionalExtras.h:68:62
> [build]  #38 0x00007fc6b27f9b00 clang::runWithSufficientStackSpace(llvm::function_ref<void ()>, llvm::function_ref<void ()>) /mnt/d/code/clang-p2996/clang/include/clang/Basic/Stack.h:52:3
> [build]  #39 0x00007fc6b27e7513 clang::Sema::runWithSufficientStackSpace(clang::SourceLocation, llvm::function_ref<void ()>) /mnt/d/code/clang-p2996/clang/lib/Sema/Sema.cpp:530:1
> [build]  #40 0x00007fc6b38e832b clang::Sema::DeduceReturnType(clang::FunctionDecl*, clang::SourceLocation, bool) /mnt/d/code/clang-p2996/clang/lib/Sema/SemaTemplateDeduction.cpp:5512:42
> [build]  #41 0x00007fc6b2e02082 clang::Sema::DiagnoseUseOfDecl(clang::NamedDecl*, llvm::ArrayRef<clang::SourceLocation>, clang::ObjCInterfaceDecl const*, bool, bool, clang::ObjCInterfaceDecl*, bool) /mnt/d/code/clang-p2996/clang/lib/Sema/SemaExpr.cpp:316:77
> [build]  #42 0x00007fc6b2d356dc clang::Sema::DiagnoseUseOfOverloadedDecl(clang::NamedDecl*, clang::SourceLocation) /mnt/d/code/clang-p2996/clang/include/clang/Sema/Sema.h:5245:29
> [build]  #43 0x00007fc6b3583c28 clang::Sema::BuildCallToMemberFunction(clang::Scope*, clang::Expr*, clang::SourceLocation, llvm::MutableArrayRef<clang::Expr*>, clang::SourceLocation, clang::Expr*, bool, bool) /mnt/d/code/clang-p2996/clang/lib/Sema/SemaOverload.cpp:15564:41
> [build]  #44 0x00007fc6b2e1f1c0 clang::Sema::BuildCallExpr(clang::Scope*, clang::Expr*, clang::SourceLocation, llvm::MutableArrayRef<clang::Expr*>, clang::SourceLocation, clang::Expr*, bool, bool) /mnt/d/code/clang-p2996/clang/lib/Sema/SemaExpr.cpp:6534:39
> [build]  #45 0x00007fc6b2e1e882 clang::Sema::ActOnCallExpr(clang::Scope*, clang::Expr*, clang::SourceLocation, llvm::MutableArrayRef<clang::Expr*>, clang::SourceLocation, clang::Expr*) /mnt/d/code/clang-p2996/clang/lib/Sema/SemaExpr.cpp:6442:20
> [build]  #46 0x00007fc6b3a246e5 clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::RebuildCallExpr(clang::Expr*, clang::SourceLocation, llvm::MutableArrayRef<clang::Expr*>, clang::SourceLocation, clang::Expr*) /mnt/d/code/clang-p2996/clang/lib/Sema/TreeTransform.h:2887:35
> [build]  #47 0x00007fc6b39ff1f3 clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformCallExpr(clang::CallExpr*) /mnt/d/code/clang-p2996/clang/lib/Sema/TreeTransform.h:12646:38
> [build]  #48 0x00007fc6b39ebd3b clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformExpr(clang::Expr*) /mnt/d/code/clang-p2996-build/tools/clang/include/clang/AST/StmtNodes.inc:608:1
> [build]  #49 0x00007fc6b3a02e47 clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformCXXFoldExpr(clang::CXXFoldExpr*) /mnt/d/code/clang-p2996/clang/lib/Sema/TreeTransform.h:15675:48
> [build]  #50 0x00007fc6b39ec0ed clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformExpr(clang::Expr*) /mnt/d/code/clang-p2996-build/tools/clang/include/clang/AST/StmtNodes.inc:742:1
> [build]  #51 0x00007fc6b39f10e0 clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformStmt(clang::Stmt*, clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::StmtDiscardKind) /mnt/d/code/clang-p2996/clang/lib/Sema/TreeTransform.h:4159:48
> [build]  #52 0x00007fc6b3a20f79 clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformCompoundStmt(clang::CompoundStmt*, bool) /mnt/d/code/clang-p2996/clang/lib/Sema/TreeTransform.h:7969:51
> [build]  #53 0x00007fc6b3a18b5f clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformCompoundStmt(clang::CompoundStmt*) /mnt/d/code/clang-p2996/clang/lib/Sema/TreeTransform.h:7952:1
> [build]  #54 0x00007fc6b39f0f07 clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformStmt(clang::Stmt*, clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::StmtDiscardKind) /mnt/d/code/clang-p2996-build/tools/clang/include/clang/AST/StmtNodes.inc:1580:1
> [build]  #55 0x00007fc6b39e5914 clang::Sema::SubstStmt(clang::Stmt*, clang::MultiLevelTemplateArgumentList const&) /mnt/d/code/clang-p2996/clang/lib/Sema/SemaTemplateInstantiate.cpp:4437:36
> [build]  #56 0x00007fc6b3a70f4a clang::Sema::InstantiateFunctionDefinition(clang::SourceLocation, clang::FunctionDecl*, bool, bool, bool) /mnt/d/code/clang-p2996/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp:5251:23
> [build]  #57 0x00007fc6b2e5884a clang::Sema::MarkFunctionReferenced(clang::SourceLocation, clang::FunctionDecl*, bool)::'lambda'()::operator()() const /mnt/d/code/clang-p2996/clang/lib/Sema/SemaExpr.cpp:18120:42
> [build]  #58 0x00007fc6b2ea8836 void llvm::function_ref<void ()>::callback_fn<clang::Sema::MarkFunctionReferenced(clang::SourceLocation, clang::FunctionDecl*, bool)::'lambda'()>(long) /mnt/d/code/clang-p2996/llvm/include/llvm/ADT/STLFunctionalExtras.h:46:40
> [build]  #59 0x00007fc6acba13a6 llvm::function_ref<void ()>::operator()() const /mnt/d/code/clang-p2996/llvm/include/llvm/ADT/STLFunctionalExtras.h:68:62
> [build]  #60 0x00007fc6b27f9b00 clang::runWithSufficientStackSpace(llvm::function_ref<void ()>, llvm::function_ref<void ()>) /mnt/d/code/clang-p2996/clang/include/clang/Basic/Stack.h:52:3
> [build]  #61 0x00007fc6b27e7513 clang::Sema::runWithSufficientStackSpace(clang::SourceLocation, llvm::function_ref<void ()>) /mnt/d/code/clang-p2996/clang/lib/Sema/Sema.cpp:530:1
> [build]  #62 0x00007fc6b2e58e29 clang::Sema::MarkFunctionReferenced(clang::SourceLocation, clang::FunctionDecl*, bool) /mnt/d/code/clang-p2996/clang/lib/Sema/SemaExpr.cpp:18142:69
> [build]  #63 0x00007fc6b2e60396 clang::Sema::MarkAnyDeclReferenced(clang::SourceLocation, clang::Decl*, bool) /mnt/d/code/clang-p2996/clang/lib/Sema/SemaExpr.cpp:19910:5
> [build]  #64 0x00007fc6b2e5fe61 MarkExprReferenced(clang::Sema&, clang::SourceLocation, clang::Decl*, clang::Expr*, bool, llvm::DenseMap<clang::VarDecl const*, int, llvm::DenseMapInfo<clang::VarDecl const*, void>, llvm::detail::DenseMapPair<clang::VarDecl const*, int>>&) /mnt/d/code/clang-p2996/clang/lib/Sema/SemaExpr.cpp:19823:46
> [build]  #65 0x00007fc6b2e60149 clang::Sema::MarkDeclRefReferenced(clang::DeclRefExpr*, clang::Expr const*) /mnt/d/code/clang-p2996/clang/lib/Sema/SemaExpr.cpp:19867:1
> [build]  #66 0x00007fc6b354604a CreateFunctionRefExpr(clang::Sema&, clang::FunctionDecl*, clang::NamedDecl*, clang::Expr const*, bool, clang::SourceLocation, clang::DeclarationNameLoc const&) /mnt/d/code/clang-p2996/clang/lib/Sema/SemaOverload.cpp:85:31
> [build]  #67 0x00007fc6b357f85f clang::Sema::CreateOverloadedBinOp(clang::SourceLocation, clang::BinaryOperatorKind, clang::UnresolvedSetImpl const&, clang::Expr*, clang::Expr*, bool, bool, clang::FunctionDecl*) /mnt/d/code/clang-p2996/clang/lib/Sema/SemaOverload.cpp:14837:50
> [build]  #68 0x00007fc6b2e4ad68 BuildOverloadedBinOp(clang::Sema&, clang::Scope*, clang::SourceLocation, clang::BinaryOperatorKind, clang::Expr*, clang::Expr*) /mnt/d/code/clang-p2996/clang/lib/Sema/SemaExpr.cpp:15231:33
> [build]  #69 0x00007fc6b2e4b648 clang::Sema::BuildBinOp(clang::Scope*, clang::SourceLocation, clang::BinaryOperatorKind, clang::Expr*, clang::Expr*) /mnt/d/code/clang-p2996/clang/lib/Sema/SemaExpr.cpp:15329:73
> [build]  #70 0x00007fc6b3a2569b clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::RebuildBinaryOperator(clang::SourceLocation, clang::BinaryOperatorKind, clang::Expr*, clang::Expr*) /mnt/d/code/clang-p2996/clang/lib/Sema/TreeTransform.h:2990:3
> [build]  #71 0x00007fc6b3a058bf clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformBinaryOperator(clang::BinaryOperator*) /mnt/d/code/clang-p2996/clang/lib/Sema/TreeTransform.h:12767:44
> [build]  #72 0x00007fc6b39ec347 clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformExpr(clang::Expr*) /mnt/d/code/clang-p2996-build/tools/clang/include/clang/AST/StmtNodes.inc:828:1
> [build]  #73 0x00007fc6b39f10e0 clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformStmt(clang::Stmt*, clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::StmtDiscardKind) /mnt/d/code/clang-p2996/clang/lib/Sema/TreeTransform.h:4159:48
> [build]  #74 0x00007fc6b3a20f79 clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformCompoundStmt(clang::CompoundStmt*, bool) /mnt/d/code/clang-p2996/clang/lib/Sema/TreeTransform.h:7969:51
> [build]  #75 0x00007fc6b3a18b5f clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformCompoundStmt(clang::CompoundStmt*) /mnt/d/code/clang-p2996/clang/lib/Sema/TreeTransform.h:7952:1
> [build]  #76 0x00007fc6b39f0f07 clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformStmt(clang::Stmt*, clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::StmtDiscardKind) /mnt/d/code/clang-p2996-build/tools/clang/include/clang/AST/StmtNodes.inc:1580:1
> [build]  #77 0x00007fc6b39e5914 clang::Sema::SubstStmt(clang::Stmt*, clang::MultiLevelTemplateArgumentList const&) /mnt/d/code/clang-p2996/clang/lib/Sema/SemaTemplateInstantiate.cpp:4437:36
> [build]  #78 0x00007fc6b3a70f4a clang::Sema::InstantiateFunctionDefinition(clang::SourceLocation, clang::FunctionDecl*, bool, bool, bool) /mnt/d/code/clang-p2996/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp:5251:23
> [build]  #79 0x00007fc6b2e5884a clang::Sema::MarkFunctionReferenced(clang::SourceLocation, clang::FunctionDecl*, bool)::'lambda'()::operator()() const /mnt/d/code/clang-p2996/clang/lib/Sema/SemaExpr.cpp:18120:42
> [build]  #80 0x00007fc6b2ea8836 void llvm::function_ref<void ()>::callback_fn<clang::Sema::MarkFunctionReferenced(clang::SourceLocation, clang::FunctionDecl*, bool)::'lambda'()>(long) /mnt/d/code/clang-p2996/llvm/include/llvm/ADT/STLFunctionalExtras.h:46:40
> [build]  #81 0x00007fc6acba13a6 llvm::function_ref<void ()>::operator()() const /mnt/d/code/clang-p2996/llvm/include/llvm/ADT/STLFunctionalExtras.h:68:62
> [build]  #82 0x00007fc6b27f9b00 clang::runWithSufficientStackSpace(llvm::function_ref<void ()>, llvm::function_ref<void ()>) /mnt/d/code/clang-p2996/clang/include/clang/Basic/Stack.h:52:3
> [build]  #83 0x00007fc6b27e7513 clang::Sema::runWithSufficientStackSpace(clang::SourceLocation, llvm::function_ref<void ()>) /mnt/d/code/clang-p2996/clang/lib/Sema/Sema.cpp:530:1
> [build]  #84 0x00007fc6b2e58e29 clang::Sema::MarkFunctionReferenced(clang::SourceLocation, clang::FunctionDecl*, bool) /mnt/d/code/clang-p2996/clang/lib/Sema/SemaExpr.cpp:18142:69
> [build]  #85 0x00007fc6b2e60396 clang::Sema::MarkAnyDeclReferenced(clang::SourceLocation, clang::Decl*, bool) /mnt/d/code/clang-p2996/clang/lib/Sema/SemaExpr.cpp:19910:5
> [build]  #86 0x00007fc6b2e5fe61 MarkExprReferenced(clang::Sema&, clang::SourceLocation, clang::Decl*, clang::Expr*, bool, llvm::DenseMap<clang::VarDecl const*, int, llvm::DenseMapInfo<clang::VarDecl const*, void>, llvm::detail::DenseMapPair<clang::VarDecl const*, int>>&) /mnt/d/code/clang-p2996/clang/lib/Sema/SemaExpr.cpp:19823:46
> [build]  #87 0x00007fc6b2e60149 clang::Sema::MarkDeclRefReferenced(clang::DeclRefExpr*, clang::Expr const*) /mnt/d/code/clang-p2996/clang/lib/Sema/SemaExpr.cpp:19867:1
> [build]  #88 0x00007fc6b2e0b6ea clang::Sema::BuildDeclRefExpr(clang::ValueDecl*, clang::QualType, clang::ExprValueKind, clang::DeclarationNameInfo const&, clang::NestedNameSpecifierLoc, clang::NamedDecl*, clang::SourceLocation, clang::TemplateArgumentListInfo const*) /mnt/d/code/clang-p2996/clang/lib/Sema/SemaExpr.cpp:2315:53
> [build]  #89 0x00007fc6b3588c84 clang::Sema::FixOverloadedFunctionReference(clang::Expr*, clang::DeclAccessPair, clang::FunctionDecl*) /mnt/d/code/clang-p2996/clang/lib/Sema/SemaOverload.cpp:16410:40
> [build]  #90 0x00007fc6b357bb05 FinishOverloadedCallExpr(clang::Sema&, clang::Scope*, clang::Expr*, clang::UnresolvedLookupExpr*, clang::SourceLocation, llvm::MutableArrayRef<clang::Expr*>, clang::SourceLocation, clang::Expr*, clang::OverloadCandidateSet*, clang::OverloadCandidate**, clang::OverloadingResult, bool) /mnt/d/code/clang-p2996/clang/lib/Sema/SemaOverload.cpp:14073:47
> [build]  #91 0x00007fc6b357c6e3 clang::Sema::BuildOverloadedCallExpr(clang::Scope*, clang::Expr*, clang::UnresolvedLookupExpr*, clang::SourceLocation, llvm::MutableArrayRef<clang::Expr*>, clang::SourceLocation, clang::Expr*, bool, bool) /mnt/d/code/clang-p2996/clang/lib/Sema/SemaOverload.cpp:14206:34
> [build]  #92 0x00007fc6b2e1f37a clang::Sema::BuildCallExpr(clang::Scope*, clang::Expr*, clang::SourceLocation, llvm::MutableArrayRef<clang::Expr*>, clang::SourceLocation, clang::Expr*, bool, bool) /mnt/d/code/clang-p2996/clang/lib/Sema/SemaExpr.cpp:6551:39
> [build]  #93 0x00007fc6b2e1e882 clang::Sema::ActOnCallExpr(clang::Scope*, clang::Expr*, clang::SourceLocation, llvm::MutableArrayRef<clang::Expr*>, clang::SourceLocation, clang::Expr*) /mnt/d/code/clang-p2996/clang/lib/Sema/SemaExpr.cpp:6442:20
> [build]  #94 0x00007fc6b26bbafd clang::Parser::ParsePostfixExpressionSuffix(clang::ActionResult<clang::Expr*, true>) /mnt/d/code/clang-p2996/clang/lib/Parse/ParseExpr.cpp:2239:36
> [build]  #95 0x00007fc6b26b9fe5 clang::Parser::ParseCastExpression(clang::Parser::CastParseKind, bool, bool&, clang::Parser::TypeCastState, bool, bool*, clang::SourceLocation) /mnt/d/code/clang-p2996/clang/lib/Parse/ParseExpr.cpp:1941:37
> [build]  #96 0x00007fc6b26b45c0 clang::Parser::ParseCastExpression(clang::Parser::CastParseKind, bool, clang::Parser::TypeCastState, bool, bool*) /mnt/d/code/clang-p2996/clang/lib/Parse/ParseExpr.cpp:714:39
> [build]  #97 0x00007fc6b26b1b90 clang::Parser::ParseAssignmentExpression(clang::Parser::TypeCastState) /mnt/d/code/clang-p2996/clang/lib/Parse/ParseExpr.cpp:184:39
> [build]  #98 0x00007fc6b26b18c5 clang::Parser::ParseExpression(clang::Parser::TypeCastState) /mnt/d/code/clang-p2996/clang/lib/Parse/ParseExpr.cpp:135:43
> [build]  #99 0x00007fc6b2743fea clang::Parser::ParseExprStatement(clang::Parser::ParsedStmtContext) /mnt/d/code/clang-p2996/clang/lib/Parse/ParseStmt.cpp:548:34
> [build] #100 0x00007fc6b2742b18 clang::Parser::ParseStatementOrDeclarationAfterAttributes(llvm::SmallVector<clang::Stmt*, 32u>&, clang::Parser::ParsedStmtContext, clang::SourceLocation*, clang::ParsedAttributes&, clang::ParsedAttributes&) /mnt/d/code/clang-p2996/clang/lib/Parse/ParseStmt.cpp:281:32
> [build] #101 0x00007fc6b2741f23 clang::Parser::ParseStatementOrDeclaration(llvm::SmallVector<clang::Stmt*, 32u>&, clang::Parser::ParsedStmtContext, clang::SourceLocation*) /mnt/d/code/clang-p2996/clang/lib/Parse/ParseStmt.cpp:121:62
> [build] #102 0x00007fc6b27469bd clang::Parser::ParseCompoundStatementBody(bool) /mnt/d/code/clang-p2996/clang/lib/Parse/ParseStmt.cpp:1245:38
> [build] #103 0x00007fc6b274c0de clang::Parser::ParseFunctionStatementBody(clang::Decl*, clang::Parser::ParseScope&) /mnt/d/code/clang-p2996/clang/lib/Parse/ParseStmt.cpp:2548:47
> [build] #104 0x00007fc6b2623123 clang::Parser::ParseFunctionDefinition(clang::ParsingDeclarator&, clang::Parser::ParsedTemplateInfo const&, clang::Parser::LateParsedAttrList*) /mnt/d/code/clang-p2996/clang/lib/Parse/Parser.cpp:1540:36
> [build] #105 0x00007fc6b2654d00 clang::Parser::ParseDeclGroup(clang::ParsingDeclSpec&, clang::DeclaratorContext, clang::ParsedAttributes&, clang::Parser::ParsedTemplateInfo&, clang::SourceLocation*, clang::Parser::ForRangeInit*) /mnt/d/code/clang-p2996/clang/lib/Parse/ParseDecl.cpp:2388:40
> [build] #106 0x00007fc6b2621cd5 clang::Parser::ParseDeclOrFunctionDefInternal(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec&, clang::AccessSpecifier) /mnt/d/code/clang-p2996/clang/lib/Parse/Parser.cpp:1264:24
> [build] #107 0x00007fc6b2621ecf clang::Parser::ParseDeclarationOrFunctionDefinition(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec*, clang::AccessSpecifier) /mnt/d/code/clang-p2996/clang/lib/Parse/Parser.cpp:1286:42
> [build] #108 0x00007fc6b2621111 clang::Parser::ParseExternalDeclaration(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec*) /mnt/d/code/clang-p2996/clang/lib/Parse/Parser.cpp:1089:50
> [build] #109 0x00007fc6b261ff34 clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, clang::Sema::ModuleImportState&) /mnt/d/code/clang-p2996/clang/lib/Parse/Parser.cpp:778:36
> [build] #110 0x00007fc6b261aeda clang::ParseAST(clang::Sema&, bool, bool) /mnt/d/code/clang-p2996/clang/lib/Parse/ParseAST.cpp:163:37
> [build] #111 0x00007fc6af1ca52a clang::ASTFrontendAction::ExecuteAction() /mnt/d/code/clang-p2996/clang/lib/Frontend/FrontendAction.cpp:1192:11
> [build] #112 0x00007fc6aee95946 clang::CodeGenAction::ExecuteAction() /mnt/d/code/clang-p2996/clang/lib/CodeGen/CodeGenAction.cpp:1147:5
> [build] #113 0x00007fc6af1c9dd4 clang::FrontendAction::Execute() /mnt/d/code/clang-p2996/clang/lib/Frontend/FrontendAction.cpp:1082:38
> [build] #114 0x00007fc6af0d4cad clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) /mnt/d/code/clang-p2996/clang/lib/Frontend/CompilerInstance.cpp:1061:42
> [build] #115 0x00007fc6af3885e3 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) /mnt/d/code/clang-p2996/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:280:38
> [build] #116 0x00007fc6a9f373b3 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) /mnt/d/code/clang-p2996/clang/tools/driver/cc1_main.cpp:232:40
> [build] #117 0x00007fc6a9f28196 ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) /mnt/d/code/clang-p2996/clang/tools/driver/driver.cpp:215:20
> [build] #118 0x00007fc6a9f283b5 clang_main(int, char**, llvm::ToolContext const&)::'lambda'(llvm::SmallVectorImpl<char const*>&)::operator()(llvm::SmallVectorImpl<char const*>&) const /mnt/d/code/clang-p2996/clang/tools/driver/driver.cpp:356:5
> [build] #119 0x00007fc6a9f29a87 int llvm::function_ref<int (llvm::SmallVectorImpl<char const*>&)>::callback_fn<clang_main(int, char**, llvm::ToolContext const&)::'lambda'(llvm::SmallVectorImpl<char const*>&)>(long, llvm::SmallVectorImpl<char const*>&) /mnt/d/code/clang-p2996/llvm/include/llvm/ADT/STLFunctionalExtras.h:47:3
> [build] #120 0x00007fc6aef15689 llvm::function_ref<int (llvm::SmallVectorImpl<char const*>&)>::operator()(llvm::SmallVectorImpl<char const*>&) const /mnt/d/code/clang-p2996/llvm/include/llvm/ADT/STLFunctionalExtras.h:69:3
> [build] #121 0x00007fc6aef1437e clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const::'lambda'()::operator()() const /mnt/d/code/clang-p2996/clang/lib/Driver/Job.cpp:440:32
> [build] #122 0x00007fc6aef1483d 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::'lambda'()>(long) /mnt/d/code/clang-p2996/llvm/include/llvm/ADT/STLFunctionalExtras.h:46:40
> [build] #123 0x00007fc6acba13a6 llvm::function_ref<void ()>::operator()() const /mnt/d/code/clang-p2996/llvm/include/llvm/ADT/STLFunctionalExtras.h:68:62
> [build] #124 0x00007fc6adf9795f llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) /mnt/d/code/clang-p2996/llvm/lib/Support/CrashRecoveryContext.cpp:427:10
> [build] #125 0x00007fc6aef1459b clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const /mnt/d/code/clang-p2996/clang/lib/Driver/Job.cpp:440:7
> [build] #126 0x00007fc6aeeaeb6b clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const /mnt/d/code/clang-p2996/clang/lib/Driver/Compilation.cpp:199:22
> [build] #127 0x00007fc6aeeaeeec clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const /mnt/d/code/clang-p2996/clang/lib/Driver/Compilation.cpp:253:62
> [build] #128 0x00007fc6aeec2591 clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) /mnt/d/code/clang-p2996/clang/lib/Driver/Driver.cpp:1942:28
> [build] #129 0x00007fc6a9f295bd clang_main(int, char**, llvm::ToolContext const&) /mnt/d/code/clang-p2996/clang/tools/driver/driver.cpp:391:39
> [build] #130 0x00007fc6a9f63e8c main /mnt/d/code/clang-p2996-build/tools/clang/tools/driver/clang-driver.cpp:17:20
> [build] #131 0x00007fc6a8409d90 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16
> [build] #132 0x00007fc6a8409e40 call_init ./csu/../csu/libc-start.c:128:20
> [build] #133 0x00007fc6a8409e40 __libc_start_main ./csu/../csu/libc-start.c:379:5
> [build] #134 0x00007fc6a9f27525 _start (/mnt/d/code/clang-p2996-build/bin/clang+++0x1524525)
> [build] clang++: error: clang frontend command failed with exit code 134 (use -v to see invocation)
> [build] clang version 19.0.0git (https://github.com/bloomberg/clang-p2996.git 0994a5ad9cf4ca20b56cde930a0bc35b0e8240cf)
> [build] Target: x86_64-unknown-linux-gnu
> [build] Thread model: posix
> [build] InstalledDir: /mnt/d/code/clang-p2996-build/bin
> [build] Build config: +unoptimized, +assertions
> [build] clang++: note: diagnostic msg: 
> [build] ********************
> [build] 
> [build] PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
> [build] Preprocessed source(s) and associated run script(s) are located at:
> [build] clang++: note: diagnostic msg: /tmp/main-9eb3f9.cpp
> [build] clang++: note: diagnostic msg: /tmp/main-9eb3f9.sh
> [build] clang++: note: diagnostic msg: 
> [build] 
> [build] ********************
> [build] gmake[2]: *** [CMakeFiles/runtime_reflection.dir/build.make:76: CMakeFiles/runtime_reflection.dir/main.cpp.o] Error 1
> [build] gmake[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/runtime_reflection.dir/all] Error 2
> [build] gmake: *** [Makefile:91: all] Error 2
> [proc] The command: /opt/cmake/bin/cmake --build /mnt/d/code/runtime_reflection/build --config Debug --target all -j 18 -- exited with code: 2
> [driver] Build completed: 00:00:52.988
> [build] Build finished with exit code 2

The interesting part is: If I change the std::meta::members_of to std::meta::nonstatic_data_members_of the compiles and works as expected. So it seems closely related to the std::meta::members_of implementation.

Environment (please complete the following information):

  • I tested this on two different systems both on Windows using a WSL environment with Ubuntu 22.04

Additional context
If you need any other debug information I will do my best to provide it

Thanks for the bug report! This is now fixed at HEAD, and should be fixed on Godbolt the day after tomorrow.