[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