[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