[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