[clang] [Clang] Fix the mangling of lambdas (PR #89204)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Apr 18 03:32:52 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: cor3ntin (cor3ntin)
<details>
<summary>Changes</summary>
Lambdas used in the initializer of a local class were not mangling the name of the member.
Fixes #<!-- -->88906
---
Full diff: https://github.com/llvm/llvm-project/pull/89204.diff
3 Files Affected:
- (modified) clang/docs/ReleaseNotes.rst (+1)
- (modified) clang/lib/AST/ItaniumMangle.cpp (+8-10)
- (added) clang/test/CodeGenCXX/mangle-lambdas-gh88906.cpp (+27)
``````````diff
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 6c51c2d1f483ce..0ad301b24e6b73 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -538,6 +538,7 @@ Bug Fixes to C++ Support
- Fix a crash in requires expression with templated base class member function. Fixes (#GH84020).
- Fix a crash caused by defined struct in a type alias template when the structure
has fields with dependent type. Fixes (#GH75221).
+- Fix the Itanium mangling of lambdas defined in a member of a local class (#GH88906)
Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index c3b98d2d2149cb..53ef022c710d8d 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -1070,14 +1070,7 @@ void CXXNameMangler::mangleNameWithAbiTags(GlobalDecl GD,
if (isLocalContainerContext(DC) && ND->hasLinkage() && !isLambda(ND))
while (!DC->isNamespace() && !DC->isTranslationUnit())
DC = Context.getEffectiveParentContext(DC);
- else if (GetLocalClassDecl(ND)) {
- mangleLocalName(GD, AdditionalAbiTags);
- return;
- }
-
- assert(!isa<LinkageSpecDecl>(DC) && "context cannot be LinkageSpecDecl");
-
- if (isLocalContainerContext(DC)) {
+ else if (GetLocalClassDecl(ND) && !isLambda(ND)) {
mangleLocalName(GD, AdditionalAbiTags);
return;
}
@@ -1089,6 +1082,13 @@ void CXXNameMangler::mangleNameWithAbiTags(GlobalDecl GD,
return;
}
+ assert(!isa<LinkageSpecDecl>(DC) && "context cannot be LinkageSpecDecl");
+
+ if (isLocalContainerContext(DC)) {
+ mangleLocalName(GD, AdditionalAbiTags);
+ return;
+ }
+
if (DC->isTranslationUnit() || isStdNamespace(DC)) {
// Check if we have a template.
const TemplateArgumentList *TemplateArgs = nullptr;
@@ -2201,8 +2201,6 @@ void CXXNameMangler::manglePrefix(const DeclContext *DC, bool NoFunction) {
if (NoFunction && isLocalContainerContext(DC))
return;
- assert(!isLocalContainerContext(DC));
-
const NamedDecl *ND = cast<NamedDecl>(DC);
if (mangleSubstitution(ND))
return;
diff --git a/clang/test/CodeGenCXX/mangle-lambdas-gh88906.cpp b/clang/test/CodeGenCXX/mangle-lambdas-gh88906.cpp
new file mode 100644
index 00000000000000..61f340c848ebe4
--- /dev/null
+++ b/clang/test/CodeGenCXX/mangle-lambdas-gh88906.cpp
@@ -0,0 +1,27 @@
+// RUN: %clang_cc1 -triple x86_64-linux-gnu %s -emit-llvm -o - | FileCheck %s
+
+class func {
+public:
+ template <typename T>
+ func(T){};
+ template <typename T, typename U>
+ func(T, U){};
+};
+
+void GH88906(){
+ class Test{
+ public:
+ func a{[]{ }, []{ }};
+ func b{[]{ }};
+ func c{[]{ }};
+ } test;
+}
+
+// CHECK-LABEL: define internal void @_ZZ7GH88906vEN4TestC2Ev
+// CHECK: call void @_ZN4funcC2IN7GH889064Test1aMUlvE_ENS3_UlvE0_EEET_T0_
+// CHECK: call void @_ZN4funcC2IN7GH889064Test1bMUlvE_EEET_
+// CHECK: call void @_ZN4funcC2IN7GH889064Test1cMUlvE_EEET_
+
+// CHECK-LABEL: define internal void @_ZN4funcC2IN7GH889064Test1aMUlvE_ENS3_UlvE0_EEET_T0_
+// CHECK-LABEL: define internal void @_ZN4funcC2IN7GH889064Test1bMUlvE_EEET_
+// CHECK-LABEL: define internal void @_ZN4funcC2IN7GH889064Test1cMUlvE_EEET_
``````````
</details>
https://github.com/llvm/llvm-project/pull/89204
More information about the cfe-commits
mailing list