Author: Matheus Izvekov Date: 2024-05-29T21:45:01-03:00 New Revision: ce2927a396c506cbf06ea39eff8f226fd8d46b94
URL: https://github.com/llvm/llvm-project/commit/ce2927a396c506cbf06ea39eff8f226fd8d46b94 DIFF: https://github.com/llvm/llvm-project/commit/ce2927a396c506cbf06ea39eff8f226fd8d46b94.diff LOG: [clang] fix printing of canonical template template parameters take 2 (#93448) Since they can also occur as the template name of template specializations, handle them from TemplateName printing instead of TemplateArgument. Added: Modified: clang/lib/AST/TemplateBase.cpp clang/lib/AST/TemplateName.cpp clang/test/SemaTemplate/deduction-guide.cpp Removed: ################################################################################ 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 &Policy, raw_ostream &Out, break; case Template: { - TemplateName TN = getAsTemplate(); - if (const auto *TD = TN.getAsTemplateDecl(); - TD && TD->getDeclName().isEmpty()) { - assert(isa<TemplateTemplateParmDecl>(TD) && - "Unexpected anonymous template"); - const auto *TTP = cast<TemplateTemplateParmDecl>(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 &ID) { void TemplateName::print(raw_ostream &OS, const PrintingPolicy &Policy, Qualified Qual) const { + auto handleAnonymousTTP = [](TemplateDecl *TD, raw_ostream &OS) { + if (TemplateTemplateParmDecl *TTP = dyn_cast<TemplateTemplateParmDecl>(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 &OS, const PrintingPolicy &Policy, // 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 &OS, const PrintingPolicy &Policy, Underlying.getKind() == TemplateName::UsingTemplate); TemplateDecl *UTD = Underlying.getAsTemplateDecl(); + + if (handleAnonymousTTP(UTD, OS)) + return; + if (IdentifierInfo *II = UTD->getIdentifier(); Policy.CleanUglifiedParameters && II && isa<TemplateTemplateParmDecl>(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 (<T>) -> B<T>'{{$}} -// CHECK-NEXT: | `-ParmVarDecl {{.+}} '<T>'{{$}} +// CHECK-NEXT: |-CXXDeductionGuideDecl {{.+}} 'auto (template-parameter-0-1<T>) -> B<T>'{{$}} +// CHECK-NEXT: | `-ParmVarDecl {{.+}} 'template-parameter-0-1<T>'{{$}} // CHECK-NEXT: `-CXXDeductionGuideDecl {{.+}} 'auto (A<int>) -> TTP::B<int>' // CHECK-NEXT: |-TemplateArgument type 'int' // CHECK-NEXT: | `-BuiltinType {{.+}} 'int'{{$}} // CHECK-NEXT: |-TemplateArgument template 'TTP::A'{{$}} // CHECK-NEXT: | `-ClassTemplateDecl {{.+}} A{{$}} // CHECK-NEXT: `-ParmVarDecl {{.+}} 'A<int>':'TTP::A<int>'{{$}} -// CHECK-NEXT: FunctionProtoType {{.+}} 'auto (<T>) -> B<T>' dependent trailing_return cdecl{{$}} +// CHECK-NEXT: FunctionProtoType {{.+}} 'auto (template-parameter-0-1<T>) -> B<T>' dependent trailing_return cdecl{{$}} // CHECK-NEXT: |-InjectedClassNameType {{.+}} 'B<T>' dependent{{$}} // CHECK-NEXT: | `-CXXRecord {{.+}} 'B'{{$}} -// CHECK-NEXT: `-ElaboratedType {{.+}} '<T>' sugar dependent{{$}} -// CHECK-NEXT: `-TemplateSpecializationType {{.+}} '<T>' dependent {{$}} +// CHECK-NEXT: `-ElaboratedType {{.+}} 'template-parameter-0-1<T>' sugar dependent{{$}} +// CHECK-NEXT: `-TemplateSpecializationType {{.+}} 'template-parameter-0-1<T>' dependent template-parameter-0-1{{$}} // CHECK-NEXT: `-TemplateArgument type 'T':'type-parameter-0-0'{{$}} // CHECK-NEXT: `-TemplateTypeParmType {{.+}} 'T' dependent depth 0 index 0{{$}} // CHECK-NEXT: `-TemplateTypeParm {{.+}} 'T'{{$}} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits