Skip to content

Commit 01f143d

Browse files
authored
[clang] fix printing of canonical template template parameters (#93124)
1 parent 7b18571 commit 01f143d

File tree

4 files changed

+20
-10
lines changed

4 files changed

+20
-10
lines changed

clang/lib/AST/TemplateBase.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -538,9 +538,19 @@ void TemplateArgument::print(const PrintingPolicy &Policy, raw_ostream &Out,
538538
Out << "nullptr";
539539
break;
540540

541-
case Template:
542-
getAsTemplate().print(Out, Policy, TemplateName::Qualified::Fully);
541+
case Template: {
542+
TemplateName TN = getAsTemplate();
543+
if (const auto *TD = TN.getAsTemplateDecl();
544+
TD && TD->getDeclName().isEmpty()) {
545+
assert(isa<TemplateTemplateParmDecl>(TD) &&
546+
"Unexpected anonymous template");
547+
const auto *TTP = cast<TemplateTemplateParmDecl>(TD);
548+
Out << "template-parameter-" << TTP->getDepth() << "-" << TTP->getIndex();
549+
} else {
550+
TN.print(Out, Policy, TemplateName::Qualified::Fully);
551+
}
543552
break;
553+
}
544554

545555
case TemplateExpansion:
546556
getAsTemplateOrTemplatePattern().print(Out, Policy);

clang/test/SemaCXX/cxx20-ctad-type-alias.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ class Foo {};
284284
// Verify that template template type parameter TTP is referenced/used in the
285285
// template arguments of the RHS.
286286
template <template<typename> typename TTP>
287-
using Bar = Foo<K<TTP>>; // expected-note {{candidate template ignored: could not match 'Foo<K<>>' against 'int'}}
287+
using Bar = Foo<K<TTP>>; // expected-note {{candidate template ignored: could not match 'Foo<K<template-parameter-0-0>>' against 'int'}}
288288

289289
template <class T>
290290
class Container {};

clang/test/SemaTemplate/deduction-guide.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,9 @@ using CT = C<int>;
102102
// CHECK: |-NonTypeTemplateParmDecl {{.*}} 'type-parameter-0-2' depth 0 index 3 V
103103
// CHECK: | `-TemplateArgument {{.*}} expr
104104
// CHECK: | `-IntegerLiteral {{.*}} 'int' 0
105-
// CHECK: |-CXXDeductionGuideDecl {{.*}} 'auto (A, Y<>, type-parameter-0-2) -> C<A>'
105+
// CHECK: |-CXXDeductionGuideDecl {{.*}} 'auto (A, Y<template-parameter-0-1>, type-parameter-0-2) -> C<A>'
106106
// CHECK: | |-ParmVarDecl {{.*}} 'A'
107-
// CHECK: | |-ParmVarDecl {{.*}} 'Y<>'
107+
// CHECK: | |-ParmVarDecl {{.*}} 'Y<template-parameter-0-1>'
108108
// CHECK: | `-ParmVarDecl {{.*}} 'type-parameter-0-2'
109109
// CHECK: `-CXXDeductionGuideDecl {{.*}} 'auto (int, Y<B>, int) -> C<int>'
110110
// CHECK: |-TemplateArgument type 'int'
@@ -114,12 +114,12 @@ using CT = C<int>;
114114
// CHECK: |-ParmVarDecl {{.*}} 'int'
115115
// CHECK: |-ParmVarDecl {{.*}} 'Y<B>'
116116
// CHECK: `-ParmVarDecl {{.*}} 'int'
117-
// CHECK: FunctionProtoType {{.*}} 'auto (A, Y<>, type-parameter-0-2) -> C<A>' dependent trailing_return cdecl
117+
// CHECK: FunctionProtoType {{.*}} 'auto (A, Y<template-parameter-0-1>, type-parameter-0-2) -> C<A>' dependent trailing_return cdecl
118118
// CHECK: |-InjectedClassNameType {{.*}} 'C<A>' dependent
119119
// CHECK: |-TemplateTypeParmType {{.*}} 'A' dependent depth 0 index 0
120120
// CHECK: | `-TemplateTypeParm {{.*}} 'A'
121-
// CHECK: |-ElaboratedType {{.*}} 'Y<>' sugar dependent
122-
// CHECK: | `-TemplateSpecializationType {{.*}} 'Y<>' dependent Y
121+
// CHECK: |-ElaboratedType {{.*}} 'Y<template-parameter-0-1>' sugar dependent
122+
// CHECK: | `-TemplateSpecializationType {{.*}} 'Y<template-parameter-0-1>' dependent Y
123123
// CHECK: | `-TemplateArgument template
124124
// CHECK: `-TemplateTypeParmType {{.*}} 'type-parameter-0-2' dependent depth 0 index 2
125125

clang/test/SemaTemplate/make_integer_seq.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ using test2 = B<int, 1>;
6161

6262
template <template <class T, T...> class S, class T, int N> struct C {
6363
using test3 = __make_integer_seq<S, T, N>;
64-
// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:63:3, col:43> col:9 test3 '__make_integer_seq<S, T, N>':'__make_integer_seq<type-parameter-0-1, N>'
64+
// CHECK: |-TypeAliasDecl 0x{{[0-9A-Fa-f]+}} <line:63:3, col:43> col:9 test3 '__make_integer_seq<S, T, N>':'__make_integer_seq<template-parameter-0-0, type-parameter-0-1, N>'
6565
// CHECK-NEXT: `-ElaboratedType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<S, T, N>' sugar dependent
6666
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<S, T, N>' sugar dependent alias __make_integer_seq
6767
// CHECK-NEXT: |-TemplateArgument template S
@@ -71,7 +71,7 @@ template <template <class T, T...> class S, class T, int N> struct C {
7171
// CHECK-NEXT: |-TemplateArgument expr
7272
// CHECK-NEXT: | `-ImplicitCastExpr 0x{{[0-9A-Fa-f]+}} <col:42> 'T' <Dependent>
7373
// CHECK-NEXT: | `-DeclRefExpr 0x{{[0-9A-Fa-f]+}} <col:42> 'int' NonTypeTemplateParm 0x{{[0-9A-Fa-f]+}} 'N' 'int'
74-
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<type-parameter-0-1, N>' dependent __make_integer_seq
74+
// CHECK-NEXT: `-TemplateSpecializationType 0x{{[0-9A-Fa-f]+}} '__make_integer_seq<template-parameter-0-0, type-parameter-0-1, N>' dependent __make_integer_seq
7575
// CHECK-NEXT: |-TemplateArgument template
7676
// CHECK-NEXT: |-TemplateArgument type 'type-parameter-0-1'
7777
// CHECK-NEXT: | `-TemplateTypeParmType 0x{{[0-9A-Fa-f]+}} 'type-parameter-0-1' dependent depth 0 index 1

0 commit comments

Comments
 (0)