Skip to content

Commit 4ed34c9

Browse files
committed
[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.
1 parent b74f50a commit 4ed34c9

File tree

3 files changed

+20
-15
lines changed

3 files changed

+20
-15
lines changed

clang/lib/AST/TemplateBase.cpp

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -544,16 +544,7 @@ void TemplateArgument::print(const PrintingPolicy &Policy, raw_ostream &Out,
544544
break;
545545

546546
case Template: {
547-
TemplateName TN = getAsTemplate();
548-
if (const auto *TD = TN.getAsTemplateDecl();
549-
TD && TD->getDeclName().isEmpty()) {
550-
assert(isa<TemplateTemplateParmDecl>(TD) &&
551-
"Unexpected anonymous template");
552-
const auto *TTP = cast<TemplateTemplateParmDecl>(TD);
553-
Out << "template-parameter-" << TTP->getDepth() << "-" << TTP->getIndex();
554-
} else {
555-
TN.print(Out, Policy);
556-
}
547+
getAsTemplate().print(Out, Policy);
557548
break;
558549
}
559550

clang/lib/AST/TemplateName.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,14 @@ void TemplateName::Profile(llvm::FoldingSetNodeID &ID) {
292292

293293
void TemplateName::print(raw_ostream &OS, const PrintingPolicy &Policy,
294294
Qualified Qual) const {
295+
auto handleAnonymousTTP = [](TemplateDecl *TD, raw_ostream &OS) {
296+
if (TemplateTemplateParmDecl *TTP = dyn_cast<TemplateTemplateParmDecl>(TD);
297+
TTP && TTP->getIdentifier() == nullptr) {
298+
OS << "template-parameter-" << TTP->getDepth() << "-" << TTP->getIndex();
299+
return true;
300+
}
301+
return false;
302+
};
295303
if (NameKind Kind = getKind();
296304
Kind == TemplateName::Template || Kind == TemplateName::UsingTemplate) {
297305
// After `namespace ns { using std::vector }`, what is the fully-qualified
@@ -304,6 +312,8 @@ void TemplateName::print(raw_ostream &OS, const PrintingPolicy &Policy,
304312
// names more often than to export them, thus using the original name is
305313
// most useful in this case.
306314
TemplateDecl *Template = getAsTemplateDecl();
315+
if (handleAnonymousTTP(Template, OS))
316+
return;
307317
if (Qual == Qualified::None)
308318
OS << *Template;
309319
else
@@ -320,6 +330,10 @@ void TemplateName::print(raw_ostream &OS, const PrintingPolicy &Policy,
320330
Underlying.getKind() == TemplateName::UsingTemplate);
321331

322332
TemplateDecl *UTD = Underlying.getAsTemplateDecl();
333+
334+
if (handleAnonymousTTP(UTD, OS))
335+
return;
336+
323337
if (IdentifierInfo *II = UTD->getIdentifier();
324338
Policy.CleanUglifiedParameters && II &&
325339
isa<TemplateTemplateParmDecl>(UTD))

clang/test/SemaTemplate/deduction-guide.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -315,19 +315,19 @@ namespace TTP {
315315
// CHECK-NEXT: |-TemplateTypeParmDecl {{.+}} class depth 0 index 0 T{{$}}
316316
// CHECK-NEXT: |-TemplateTemplateParmDecl {{.+}} depth 0 index 1 TT{{$}}
317317
// CHECK-NEXT: | `-TemplateTypeParmDecl {{.+}} class depth 1 index 0{{$}}
318-
// CHECK-NEXT: |-CXXDeductionGuideDecl {{.+}} 'auto (<T>) -> B<T>'{{$}}
319-
// CHECK-NEXT: | `-ParmVarDecl {{.+}} '<T>'{{$}}
318+
// CHECK-NEXT: |-CXXDeductionGuideDecl {{.+}} 'auto (template-parameter-0-1<T>) -> B<T>'{{$}}
319+
// CHECK-NEXT: | `-ParmVarDecl {{.+}} 'template-parameter-0-1<T>'{{$}}
320320
// CHECK-NEXT: `-CXXDeductionGuideDecl {{.+}} 'auto (A<int>) -> TTP::B<int>'
321321
// CHECK-NEXT: |-TemplateArgument type 'int'
322322
// CHECK-NEXT: | `-BuiltinType {{.+}} 'int'{{$}}
323323
// CHECK-NEXT: |-TemplateArgument template 'TTP::A'{{$}}
324324
// CHECK-NEXT: | `-ClassTemplateDecl {{.+}} A{{$}}
325325
// CHECK-NEXT: `-ParmVarDecl {{.+}} 'A<int>':'TTP::A<int>'{{$}}
326-
// CHECK-NEXT: FunctionProtoType {{.+}} 'auto (<T>) -> B<T>' dependent trailing_return cdecl{{$}}
326+
// CHECK-NEXT: FunctionProtoType {{.+}} 'auto (template-parameter-0-1<T>) -> B<T>' dependent trailing_return cdecl{{$}}
327327
// CHECK-NEXT: |-InjectedClassNameType {{.+}} 'B<T>' dependent{{$}}
328328
// CHECK-NEXT: | `-CXXRecord {{.+}} 'B'{{$}}
329-
// CHECK-NEXT: `-ElaboratedType {{.+}} '<T>' sugar dependent{{$}}
330-
// CHECK-NEXT: `-TemplateSpecializationType {{.+}} '<T>' dependent {{$}}
329+
// CHECK-NEXT: `-ElaboratedType {{.+}} 'template-parameter-0-1<T>' sugar dependent{{$}}
330+
// CHECK-NEXT: `-TemplateSpecializationType {{.+}} 'template-parameter-0-1<T>' dependent template-parameter-0-1{{$}}
331331
// CHECK-NEXT: `-TemplateArgument type 'T':'type-parameter-0-0'{{$}}
332332
// CHECK-NEXT: `-TemplateTypeParmType {{.+}} 'T' dependent depth 0 index 0{{$}}
333333
// CHECK-NEXT: `-TemplateTypeParm {{.+}} 'T'{{$}}

0 commit comments

Comments
 (0)