[clang] [clang] Fix Mame Mangling Crashes (PR #134486)
via cfe-commits
cfe-commits at lists.llvm.org
Sat Apr 5 01:20:19 PDT 2025
https://github.com/Mr-Anyone created https://github.com/llvm/llvm-project/pull/134486
It appears that Clang currently mangles names incorrectly when handling lambda expressions in constraint (`requires`) clauses.
The issue likely stems from `mangleLocalName` being used, whereas `mangleNestedName` should be invoked instead. This is supported by the fact that GCC generates the following mangled name for the example below:
```cpp
template<typename T>
auto a = [](T a) requires requires {
[](T a){}(a);
} {
return a;
};
// _ZNK1aIiEUliE_clEiQrqXcltlNS_IT_EUlS2_E_EEfL0p_EE
// ^
// |
// Nested Name
void func() {
a<int>(1);
}
```
GCC produces this mangled name:
Example output from clang after this change with previously crashing code:
```cpp
template<typename T>
auto a = [](T a)requires requires{
[](T a){}(a);
}{
return a;
};
//
void func(){
//_ZNK1aIiEMUliE_clEiQrqXclLN1aMUlT_E_clUlS3_E_EEfp_EE
a<int>(1);
}
void func2() {
// _ZZ5func2vENK3$_0clIiEEDaT_QrqXclLNS_clUlTnivE_EEEE
[](auto x) requires requires {
[]<int = 0>() {}();
} {}(0);
}
```
It seems that something like this resolves these issues:
resolve #132925
resolve #131620
resolve #102169
>From 75310f7fbdae35e8e8a8acb5d3b27c28b34a1813 Mon Sep 17 00:00:00 2001
From: Mr-Anyone <53135664+Mr-Anyone at users.noreply.github.com>
Date: Sat, 5 Apr 2025 01:09:00 -0700
Subject: [PATCH] [clang] Fix Mame Mangling Crashes
---
clang/lib/AST/ItaniumMangle.cpp | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index fdd84d0bf7c5c..90d6255917654 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -1088,6 +1088,16 @@ void CXXNameMangler::mangleNameWithAbiTags(GlobalDecl GD,
return;
}
+ const RecordDecl *RD = GetLocalClassDecl(GD.getDecl());
+ if(RD){
+ const DeclContext *DC = Context.getEffectiveDeclContext(RD);
+ const FunctionDecl* FD = dyn_cast<FunctionDecl>(DC);
+ if(FD->getTrailingRequiresClause() && IsLambda){
+ mangleNestedName(GD, DC, AdditionalAbiTags);
+ return;
+ }
+ }
+
if (isLocalContainerContext(DC)) {
mangleLocalName(GD, AdditionalAbiTags);
return;
More information about the cfe-commits
mailing list