[clang] [Clang] Fix Itanium mangling crash for local lambda in ctor/dtor (PR #181068)
Eli Friedman via cfe-commits
cfe-commits at lists.llvm.org
Sun Apr 5 12:59:15 PDT 2026
================
@@ -0,0 +1,33 @@
+// 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 -O2 -disable-llvm-passes -emit-llvm -o - %s | FileCheck %s
+
+struct E {
+ E();
+ template<typename T>
+ E(T t);
+ ~E();
+};
+
+E::E() {
+ struct {
+ // CHECK-DAG: _ZTSN1EC13$_012anotherValueMUlvE_E
+ int anotherValue = [x = 1] { return x; }();
+ } obj;
+}
+
+template<typename T>
+E::E(T t) {
+ struct {
+ // CHECK-DAG: _ZTSN1EC1IiEUt_UlvE_E
----------------
efriedma-quic wrote:
This mangling isn't correct.
Compare the following in clang vs. gcc:
```
struct E {
E();
template<typename T>
E(T t);
~E();
};
inline E::E() {
struct {
int anotherValue = [x = 1] { static int z = 10; return z+++x; }();
} obj;
}
template<typename T>
E::E(T t) {
struct {
// CHECK-DAG: _ZTSN1EC1IiEUt_UlvE_E
int anotherValue = [x = 1] { static int z = 10; return z+++x; }();
int anotherValue2 = [x = 1] { static int z = 10; return z+++x; }();
} obj;
}
E e{1};
E e2;
```
But I'm not sure it's actually directly connected to your patch; maybe file a bug.
https://github.com/llvm/llvm-project/pull/181068
More information about the cfe-commits
mailing list