[clang] 7113aec - [clang] ItaniumMangle: fix mangling for unresolved types (#135312)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Apr 11 07:31:30 PDT 2025
Author: Matheus Izvekov
Date: 2025-04-11T11:31:26-03:00
New Revision: 7113aece4eaa634cdcea5c4057da171c17229b40
URL: https://github.com/llvm/llvm-project/commit/7113aece4eaa634cdcea5c4057da171c17229b40
DIFF: https://github.com/llvm/llvm-project/commit/7113aece4eaa634cdcea5c4057da171c17229b40.diff
LOG: [clang] ItaniumMangle: fix mangling for unresolved types (#135312)
Added:
Modified:
clang/lib/AST/ItaniumMangle.cpp
clang/test/CodeGenCXX/mangle.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index 8790a5282a96b..c73f040ba1cb7 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -2511,7 +2511,6 @@ bool CXXNameMangler::mangleUnresolvedTypeOrSimpleId(QualType Ty,
case Type::PackIndexing:
case Type::TemplateTypeParm:
case Type::UnaryTransform:
- case Type::SubstTemplateTypeParm:
unresolvedType:
// Some callers want a prefix before the mangled type.
Out << Prefix;
@@ -2524,6 +2523,16 @@ bool CXXNameMangler::mangleUnresolvedTypeOrSimpleId(QualType Ty,
// so we return directly.
return true;
+ case Type::SubstTemplateTypeParm: {
+ auto *ST = cast<SubstTemplateTypeParmType>(Ty);
+ // If this was replaced from a type alias, this is not substituted
+ // from an outer template parameter, so it's not an unresolved-type.
+ if (auto *TD = dyn_cast<TemplateDecl>(ST->getAssociatedDecl());
+ TD && TD->isTypeAlias())
+ return mangleUnresolvedTypeOrSimpleId(ST->getReplacementType(), Prefix);
+ goto unresolvedType;
+ }
+
case Type::Typedef:
mangleSourceNameWithAbiTags(cast<TypedefType>(Ty)->getDecl());
break;
diff --git a/clang/test/CodeGenCXX/mangle.cpp b/clang/test/CodeGenCXX/mangle.cpp
index cf506aff92f0e..f4dc17bc4561e 100644
--- a/clang/test/CodeGenCXX/mangle.cpp
+++ b/clang/test/CodeGenCXX/mangle.cpp
@@ -1220,3 +1220,30 @@ namespace test61 {
// CHECK-LABEL: @_ZN6test611fINS_1XEEEvNT_1Y1aENS3_1bE
template void f<X>(int, int);
}
+
+namespace test62 {
+ template <class> struct integral_constant {
+ static const int value = true;
+ };
+ template <int> struct _OrImpl {};
+ template <class _Args> using _Or = _OrImpl<_Args::value>;
+ template <class _Up>
+ void f(_Or<integral_constant<_Up>>) {}
+ // CHECK-LABEL: @_ZN6test621fIiEEvNS_7_OrImplIXsr17integral_constantIT_EE5valueEEE
+ template void f<int>(_OrImpl<1>);
+} // namespace test62
+
+namespace test63 {
+ namespace {
+ template <class, class> struct integral_constant {
+ static const int value = true;
+ };
+ template <class, class> struct _And {};
+ template <int> struct _OrImpl {};
+ template <class _First> using _Or = _OrImpl<_First::value>;
+ template <class _Up>
+ void f(_And<integral_constant<int, void>, _Or<integral_constant<_Up, int>>>);
+ } // namespace
+ // CHECK-LABEL: @_ZN6test6312_GLOBAL__N_11fIiEEvNS0_4_AndINS0_17integral_constantIivEENS0_7_OrImplIXsr17integral_constantIT_iEE5valueEEEEE
+ void g() { f<int>({}); }
+} // namespace test63
More information about the cfe-commits
mailing list