https://github.com/eiytoq updated https://github.com/llvm/llvm-project/pull/181068
>From 932dc25bccfb0e25f6a384af97c133afad1a6f37 Mon Sep 17 00:00:00 2001 From: eiytoq <[email protected]> Date: Thu, 12 Feb 2026 09:25:21 +0800 Subject: [PATCH] [Clang] Fix Itanium mangling crash for local lambda in ctor/dtor --- clang/docs/ReleaseNotes.rst | 1 + clang/lib/AST/ItaniumMangle.cpp | 22 +++++++++++++-- .../CodeGenCXX/dtor-local-lambda-mangle.cpp | 28 +++++++++++++++++++ 3 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 clang/test/CodeGenCXX/dtor-local-lambda-mangle.cpp diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 7dc6881ed43e6..39d5686dce5f6 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -236,6 +236,7 @@ Bug Fixes to C++ Support - Fixed a crash when instantiating ``requires`` expressions involving substitution failures in C++ concepts. (#GH176402) - Fixed a crash when a default argument is passed to an explicit object parameter. (#GH176639) - Fixed a crash when diagnosing an invalid static member function with an explicit object parameter (#GH177741) +- Fixed a crash in Itanium C++ name mangling for a lambda in a local class field initializer inside a constructor/destructor. (#GH176395) Bug Fixes to AST Handling ^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp index fa28c0d444cc4..c77c75aee941f 100644 --- a/clang/lib/AST/ItaniumMangle.cpp +++ b/clang/lib/AST/ItaniumMangle.cpp @@ -2195,18 +2195,34 @@ void CXXNameMangler::manglePrefix(const DeclContext *DC, bool NoFunction) { if (mangleSubstitution(ND)) return; + auto getPrefixGlobalDecl = [this](const NamedDecl *ND) -> GlobalDecl { + if (const auto *CD = dyn_cast<CXXConstructorDecl>(ND)) { + if (ND == Structor) + return GlobalDecl(CD, static_cast<CXXCtorType>(StructorType)); + return GlobalDecl(CD, Ctor_Complete); + } + if (const auto *DD = dyn_cast<CXXDestructorDecl>(ND)) { + if (ND == Structor) + return GlobalDecl(DD, static_cast<CXXDtorType>(StructorType)); + return GlobalDecl(DD, Dtor_Complete); + } + if (const auto *FD = dyn_cast<FunctionDecl>(ND)) + return GlobalDecl(FD); + return GlobalDecl(ND); + }; + // Check if we have a template-prefix or a closure-prefix. const TemplateArgumentList *TemplateArgs = nullptr; - if (GlobalDecl TD = isTemplate(ND, TemplateArgs)) { + if (GlobalDecl TD = isTemplate(getPrefixGlobalDecl(ND), TemplateArgs)) { mangleTemplatePrefix(TD); mangleTemplateArgs(asTemplateName(TD), *TemplateArgs); } else if (const NamedDecl *PrefixND = getClosurePrefix(ND)) { mangleClosurePrefix(PrefixND, NoFunction); - mangleUnqualifiedName(ND, nullptr, nullptr); + mangleUnqualifiedName(getPrefixGlobalDecl(ND), nullptr, nullptr); } else { const DeclContext *DC = Context.getEffectiveDeclContext(ND); manglePrefix(DC, NoFunction); - mangleUnqualifiedName(ND, DC, nullptr); + mangleUnqualifiedName(getPrefixGlobalDecl(ND), DC, nullptr); } addSubstitution(ND); diff --git a/clang/test/CodeGenCXX/dtor-local-lambda-mangle.cpp b/clang/test/CodeGenCXX/dtor-local-lambda-mangle.cpp new file mode 100644 index 0000000000000..49d3621ca00cf --- /dev/null +++ b/clang/test/CodeGenCXX/dtor-local-lambda-mangle.cpp @@ -0,0 +1,28 @@ +// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 -O2 -emit-llvm -o /dev/null %s +// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 -fclang-abi-compat=18 -emit-llvm -o - %s | FileCheck %s + +struct E { + E(); + ~E(); +}; + +E::E() { + struct { + int anotherValue = [] { return 1; }(); + } obj; +} + +E::~E() { + struct { + int anotherValue = [] { return 2; }(); + } obj; +} + +// CHECK-LABEL: define{{.*}} @"_ZZN1EC1EvEN3$_0C2Ev" +// CHECK: call{{.*}} @"_ZZN1EC1EvENK3$_012anotherValueMUlvE_clEv" +// CHECK-LABEL: define{{.*}} @"_ZZN1EC1EvENK3$_012anotherValueMUlvE_clEv" + +// CHECK-LABEL: define{{.*}} @"_ZZN1ED1EvEN3$_0C2Ev" +// CHECK: call{{.*}} @"_ZZN1ED1EvENK3$_012anotherValueMUlvE_clEv" +// CHECK-LABEL: define{{.*}} @"_ZZN1ED1EvENK3$_012anotherValueMUlvE_clEv" _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
