https://github.com/mizvekov updated
https://github.com/llvm/llvm-project/pull/93448
>From 4ed34c959afa51328102ec037b418dbfc84ab063 Mon Sep 17 00:00:00 2001
From: Matheus Izvekov
Date: Mon, 27 May 2024 05:51:18 -0300
Subject: [PATCH] [clang] fix printing of canonical template template
parameters take 2
Since they can also occur as the template name of
template specializations, handle them from TemplateName
printing instead of TemplateArgument.
---
clang/lib/AST/TemplateBase.cpp | 11 +--
clang/lib/AST/TemplateName.cpp | 14 ++
clang/test/SemaTemplate/deduction-guide.cpp | 10 +-
3 files changed, 20 insertions(+), 15 deletions(-)
diff --git a/clang/lib/AST/TemplateBase.cpp b/clang/lib/AST/TemplateBase.cpp
index 6d3c843cfd29e..46f7b79b272ef 100644
--- a/clang/lib/AST/TemplateBase.cpp
+++ b/clang/lib/AST/TemplateBase.cpp
@@ -544,16 +544,7 @@ void TemplateArgument::print(const PrintingPolicy ,
raw_ostream ,
break;
case Template: {
-TemplateName TN = getAsTemplate();
-if (const auto *TD = TN.getAsTemplateDecl();
-TD && TD->getDeclName().isEmpty()) {
- assert(isa(TD) &&
- "Unexpected anonymous template");
- const auto *TTP = cast(TD);
- Out << "template-parameter-" << TTP->getDepth() << "-" <<
TTP->getIndex();
-} else {
- TN.print(Out, Policy);
-}
+getAsTemplate().print(Out, Policy);
break;
}
diff --git a/clang/lib/AST/TemplateName.cpp b/clang/lib/AST/TemplateName.cpp
index 3aae998eceeb0..3dbdad92813f6 100644
--- a/clang/lib/AST/TemplateName.cpp
+++ b/clang/lib/AST/TemplateName.cpp
@@ -292,6 +292,14 @@ void TemplateName::Profile(llvm::FoldingSetNodeID ) {
void TemplateName::print(raw_ostream , const PrintingPolicy ,
Qualified Qual) const {
+ auto handleAnonymousTTP = [](TemplateDecl *TD, raw_ostream ) {
+if (TemplateTemplateParmDecl *TTP = dyn_cast(TD);
+TTP && TTP->getIdentifier() == nullptr) {
+ OS << "template-parameter-" << TTP->getDepth() << "-" << TTP->getIndex();
+ return true;
+}
+return false;
+ };
if (NameKind Kind = getKind();
Kind == TemplateName::Template || Kind == TemplateName::UsingTemplate) {
// After `namespace ns { using std::vector }`, what is the fully-qualified
@@ -304,6 +312,8 @@ void TemplateName::print(raw_ostream , const
PrintingPolicy ,
// names more often than to export them, thus using the original name is
// most useful in this case.
TemplateDecl *Template = getAsTemplateDecl();
+if (handleAnonymousTTP(Template, OS))
+ return;
if (Qual == Qualified::None)
OS << *Template;
else
@@ -320,6 +330,10 @@ void TemplateName::print(raw_ostream , const
PrintingPolicy ,
Underlying.getKind() == TemplateName::UsingTemplate);
TemplateDecl *UTD = Underlying.getAsTemplateDecl();
+
+if (handleAnonymousTTP(UTD, OS))
+ return;
+
if (IdentifierInfo *II = UTD->getIdentifier();
Policy.CleanUglifiedParameters && II &&
isa(UTD))
diff --git a/clang/test/SemaTemplate/deduction-guide.cpp
b/clang/test/SemaTemplate/deduction-guide.cpp
index 96b4cd9622a24..100b580fe9f02 100644
--- a/clang/test/SemaTemplate/deduction-guide.cpp
+++ b/clang/test/SemaTemplate/deduction-guide.cpp
@@ -315,19 +315,19 @@ namespace TTP {
// CHECK-NEXT: |-TemplateTypeParmDecl {{.+}} class depth 0 index 0 T{{$}}
// CHECK-NEXT: |-TemplateTemplateParmDecl {{.+}} depth 0 index 1 TT{{$}}
// CHECK-NEXT: | `-TemplateTypeParmDecl {{.+}} class depth 1 index 0{{$}}
-// CHECK-NEXT: |-CXXDeductionGuideDecl {{.+}} 'auto () -> B'{{$}}
-// CHECK-NEXT: | `-ParmVarDecl {{.+}} ''{{$}}
+// CHECK-NEXT: |-CXXDeductionGuideDecl {{.+}} 'auto
(template-parameter-0-1) -> B'{{$}}
+// CHECK-NEXT: | `-ParmVarDecl {{.+}} 'template-parameter-0-1'{{$}}
// CHECK-NEXT: `-CXXDeductionGuideDecl {{.+}} 'auto (A) -> TTP::B'
// CHECK-NEXT:|-TemplateArgument type 'int'
// CHECK-NEXT:| `-BuiltinType {{.+}} 'int'{{$}}
// CHECK-NEXT:|-TemplateArgument template 'TTP::A'{{$}}
// CHECK-NEXT:| `-ClassTemplateDecl {{.+}} A{{$}}
// CHECK-NEXT:`-ParmVarDecl {{.+}} 'A':'TTP::A'{{$}}
-// CHECK-NEXT: FunctionProtoType {{.+}} 'auto () -> B' dependent
trailing_return cdecl{{$}}
+// CHECK-NEXT: FunctionProtoType {{.+}} 'auto (template-parameter-0-1) ->
B' dependent trailing_return cdecl{{$}}
// CHECK-NEXT: |-InjectedClassNameType {{.+}} 'B' dependent{{$}}
// CHECK-NEXT: | `-CXXRecord {{.+}} 'B'{{$}}
-// CHECK-NEXT: `-ElaboratedType {{.+}} '' sugar dependent{{$}}
-// CHECK-NEXT:`-TemplateSpecializationType {{.+}} '' dependent {{$}}
+// CHECK-NEXT: `-ElaboratedType {{.+}} 'template-parameter-0-1' sugar
dependent{{$}}
+// CHECK-NEXT:`-TemplateSpecializationType {{.+}}
'template-parameter-0-1' dependent template-parameter-0-1{{$}}
// CHECK-NEXT: `-TemplateArgument type 'T':'type-parameter-0-0'{{$}}
// CHECK-NEXT: