[clang] [Clang] Fix new initializer list mangling (PR #232629)

Kunal Dubey via cfe-commits cfe-commits at lists.llvm.org
Sun Oct 18 20:43:13 PDT 2026


https://github.com/xakep8 updated https://github.com/llvm/llvm-project/pull/232629

>From 2c74e41cb3dc69aadc78b3dd29de350e88c71c58 Mon Sep 17 00:00:00 2001
From: Kunal Dubey <xakep8 at protonmail.com>
Date: Fri, 16 Oct 2026 12:32:04 +0530
Subject: [PATCH] [Clang] Fix Incorrect mangling for "new
 std::initializer_list<int>{1}"

---
 clang/lib/AST/ItaniumMangle.cpp        |  2 ++
 clang/test/CodeGenCXX/mangle-exprs.cpp | 20 +++++++++++++++++++-
 2 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index ddde9d48606df3..441aad41edc0d2 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -5344,6 +5344,8 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity,
       else
         Out << "pi";
       const Expr *Init = New->getInitializer();
+      if (const auto *SILE = dyn_cast<CXXStdInitializerListExpr>(Init))
+        Init = SILE->getSubExpr()->IgnoreImplicit();
       if (const CXXConstructExpr *CCE = dyn_cast<CXXConstructExpr>(Init)) {
         // Directly inline the initializers.
         for (CXXConstructExpr::const_arg_iterator I = CCE->arg_begin(),
diff --git a/clang/test/CodeGenCXX/mangle-exprs.cpp b/clang/test/CodeGenCXX/mangle-exprs.cpp
index b75f2cf3607b3f..574cd81952d9ae 100644
--- a/clang/test/CodeGenCXX/mangle-exprs.cpp
+++ b/clang/test/CodeGenCXX/mangle-exprs.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -Wno-error=return-type -std=c++11 -fclang-abi-compat=latest -emit-llvm %s -o - -triple=x86_64-apple-darwin9 | FileCheck %s
+// RUN: %clang_cc1 -Wno-error=return-type -Wno-dangling-initializer-list -std=c++11 -fclang-abi-compat=latest -emit-llvm %s -o - -triple=x86_64-apple-darwin9 | FileCheck %s
 
 namespace std {
   typedef decltype(sizeof(int)) size_t;
@@ -212,6 +212,24 @@ namespace test4 {
 
 }
 
+namespace new_std_initializer_list {
+  template <int N>
+  void empty(decltype((N, new std::initializer_list<int>{}))) {}
+
+  template <int N>
+  void one(decltype((N, new std::initializer_list<int>{1}))) {}
+
+  template <int N>
+  void two(decltype((N, new std::initializer_list<int>{1, 2}))) {}
+
+  // CHECK-LABEL: define {{.*}} @_ZN24new_std_initializer_list5emptyILi0EEEvDTcmT_nw_St16initializer_listIiEilEE
+  template void empty<0>(std::initializer_list<int> *);
+  // CHECK-LABEL: define {{.*}} @_ZN24new_std_initializer_list3oneILi0EEEvDTcmT_nw_St16initializer_listIiEilLi1EEE
+  template void one<0>(std::initializer_list<int> *);
+  // CHECK-LABEL: define {{.*}} @_ZN24new_std_initializer_list3twoILi0EEEvDTcmT_nw_St16initializer_listIiEilLi1ELi2EEE
+  template void two<0>(std::initializer_list<int> *);
+}
+
 namespace test5 {
   template <typename T> void a(decltype(noexcept(T()))) {}
   template void a<int>(decltype(noexcept(int())));



More information about the cfe-commits mailing list