Skip to content

Commit f43721a

Browse files
authored
[clang][AST] Pretty-print default template template args (#162134)
1 parent a280db6 commit f43721a

File tree

4 files changed

+22
-3
lines changed

4 files changed

+22
-3
lines changed

clang/docs/ReleaseNotes.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ AST Dumping Potentially Breaking Changes
126126
- Pretty-printing of templates with inherited (i.e. specified in a previous
127127
redeclaration) default arguments has been fixed.
128128

129+
- Default arguments of template template parameters are pretty-printed now.
130+
129131
Clang Frontend Potentially Breaking Changes
130132
-------------------------------------------
131133
- Members of anonymous unions/structs are now injected as ``IndirectFieldDecl``

clang/lib/AST/DeclPrinter.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ namespace {
111111
void VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D);
112112
void VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *TTP);
113113
void VisitNonTypeTemplateParmDecl(const NonTypeTemplateParmDecl *NTTP);
114+
void VisitTemplateTemplateParmDecl(const TemplateTemplateParmDecl *);
114115
void VisitHLSLBufferDecl(HLSLBufferDecl *D);
115116

116117
void VisitOpenACCDeclareDecl(OpenACCDeclareDecl *D);
@@ -1189,8 +1190,7 @@ void DeclPrinter::printTemplateParameters(const TemplateParameterList *Params,
11891190
} else if (auto NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
11901191
VisitNonTypeTemplateParmDecl(NTTP);
11911192
} else if (auto TTPD = dyn_cast<TemplateTemplateParmDecl>(Param)) {
1192-
VisitTemplateDecl(TTPD);
1193-
// FIXME: print the default argument, if present.
1193+
VisitTemplateTemplateParmDecl(TTPD);
11941194
}
11951195
}
11961196

@@ -1916,6 +1916,16 @@ void DeclPrinter::VisitNonTypeTemplateParmDecl(
19161916
}
19171917
}
19181918

1919+
void DeclPrinter::VisitTemplateTemplateParmDecl(
1920+
const TemplateTemplateParmDecl *TTPD) {
1921+
VisitTemplateDecl(TTPD);
1922+
if (TTPD->hasDefaultArgument() && !TTPD->defaultArgumentWasInherited()) {
1923+
Out << " = ";
1924+
TTPD->getDefaultArgument().getArgument().print(Policy, Out,
1925+
/*IncludeType=*/false);
1926+
}
1927+
}
1928+
19191929
void DeclPrinter::VisitOpenACCDeclareDecl(OpenACCDeclareDecl *D) {
19201930
if (!D->isInvalidDecl()) {
19211931
Out << "#pragma acc declare";

clang/test/AST/ast-print-record-decl.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,4 +315,11 @@ template <int, int = 0> KW SmearedNTTPDefArgs;
315315
// PRINT-CXX-NEXT: template <int = 0, int> [[KW]] SmearedNTTPDefArgs;
316316
template <int = 0, int> KW SmearedNTTPDefArgs;
317317

318+
// PRINT-CXX-LABEL: Tpl
319+
template <int> KW Tpl;
320+
// PRINT-CXX-NEXT: template <template <int> class, template <int> class = Tpl> [[KW]] SmearedTplDefArgs;
321+
template <template <int> class, template <int> class = Tpl> KW SmearedTplDefArgs;
322+
// PRINT-CXX-NEXT: template <template <int> class = Tpl, template <int> class> [[KW]] SmearedTplDefArgs;
323+
template <template <int> class = Tpl, template <int> class> KW SmearedTplDefArgs;
324+
318325
#endif

clang/unittests/AST/DeclPrinterTest.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1090,7 +1090,7 @@ TEST(DeclPrinter, TestClassTemplateDecl9) {
10901090
"template<typename T> struct Z { };"
10911091
"template<template<typename U> class T = Z> struct A { };",
10921092
classTemplateDecl(hasName("A")).bind("id"),
1093-
"template <template <typename U> class T> struct A {}"));
1093+
"template <template <typename U> class T = Z> struct A {}"));
10941094
}
10951095

10961096
TEST(DeclPrinter, TestClassTemplateDecl10) {

0 commit comments

Comments
 (0)