[clang] [Clang] Do not assume existing substition for template specialization (PR #227501)

via cfe-commits cfe-commits at lists.llvm.org
Tue Sep 29 18:25:18 PDT 2026


================
@@ -2590,57 +2588,70 @@ bool CXXNameMangler::mangleUnresolvedTypeOrSimpleId(QualType Ty,
     const TemplateSpecializationType *TST =
         cast<TemplateSpecializationType>(Ty);
     TemplateName TN = TST->getTemplateName();
-    switch (TN.getKind()) {
-    case TemplateName::Template:
-    case TemplateName::QualifiedTemplate: {
-      TemplateDecl *TD = TN.getAsTemplateDecl();
-
-      // If the base is a template template parameter, this is an
-      // unresolved type.
-      assert(TD && "no template for template specialization type");
-      if (isa<TemplateTemplateParmDecl>(TD))
-        goto unresolvedType;
-
-      mangleSourceNameWithAbiTags(TD);
-      break;
-    }
-    case TemplateName::DependentTemplate: {
-      const DependentTemplateStorage *S = TN.getAsDependentTemplateName();
-      mangleSourceName(S->getName().getIdentifier());
-      break;
+
+    // It is possible that a name doesn't mangled when reaching a substitution
+    // like alias template.
+    bool MangledAsSubstitution = false;
+    while (TN.getKind() == TemplateName::SubstTemplateTemplateParm) {
+      TemplateName Replacement =
+          TN.getAsSubstTemplateTemplateParm()->getReplacement();
+      if (mangleSubstitution(Replacement)) {
+        MangledAsSubstitution = true;
+        break;
+      }
+      TN = Replacement;
     }
----------------
aokblast wrote:

Thanks! Hope this is what you were looking for.

https://github.com/llvm/llvm-project/pull/227501


More information about the cfe-commits mailing list