[clang] [clang][AST] Pretty-print default template template args (PR #162134)
    Andrey Ali Khan Bolshakov via cfe-commits 
    cfe-commits at lists.llvm.org
       
    Mon Oct  6 23:58:46 PDT 2025
    
    
  
https://github.com/bolshakov-a updated https://github.com/llvm/llvm-project/pull/162134
>From 6afe3fe6f81f920d5ea6019b1117f42f8c079195 Mon Sep 17 00:00:00 2001
From: Bolshakov <bolsh.andrey at yandex.ru>
Date: Mon, 6 Oct 2025 21:57:33 +0300
Subject: [PATCH 1/2] [clang][AST] Pretty-print default template template args
---
 clang/docs/ReleaseNotes.rst             | 2 +-
 clang/lib/AST/DeclPrinter.cpp           | 6 +++++-
 clang/test/AST/ast-print-record-decl.c  | 7 +++++++
 clang/unittests/AST/DeclPrinterTest.cpp | 2 +-
 4 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 390e0fa7a9a2b..be585e4919b54 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -124,7 +124,7 @@ AST Dumping Potentially Breaking Changes
     ``__atomic_test_and_set(p, 0)``
 
 - Pretty-printing of templates with inherited (i.e. specified in a previous
-  redeclaration) default arguments has been fixed.
+  redeclaration) and template default arguments has been fixed.
 
 Clang Frontend Potentially Breaking Changes
 -------------------------------------------
diff --git a/clang/lib/AST/DeclPrinter.cpp b/clang/lib/AST/DeclPrinter.cpp
index 7001adeff5397..b2a837b82bb13 100644
--- a/clang/lib/AST/DeclPrinter.cpp
+++ b/clang/lib/AST/DeclPrinter.cpp
@@ -1190,7 +1190,11 @@ void DeclPrinter::printTemplateParameters(const TemplateParameterList *Params,
       VisitNonTypeTemplateParmDecl(NTTP);
     } else if (auto TTPD = dyn_cast<TemplateTemplateParmDecl>(Param)) {
       VisitTemplateDecl(TTPD);
-      // FIXME: print the default argument, if present.
+      if (TTPD->hasDefaultArgument() && !TTPD->defaultArgumentWasInherited()) {
+        Out << " = ";
+        TTPD->getDefaultArgument().getArgument().print(Policy, Out,
+                                                       /*IncludeType=*/false);
+      }
     }
   }
 
diff --git a/clang/test/AST/ast-print-record-decl.c b/clang/test/AST/ast-print-record-decl.c
index fd815881ebeb0..394f837c3645d 100644
--- a/clang/test/AST/ast-print-record-decl.c
+++ b/clang/test/AST/ast-print-record-decl.c
@@ -315,4 +315,11 @@ template <int, int = 0> KW SmearedNTTPDefArgs;
 // PRINT-CXX-NEXT: template <int = 0, int> [[KW]] SmearedNTTPDefArgs;
 template <int = 0, int> KW SmearedNTTPDefArgs;
 
+// PRINT-CXX-LABEL: Tpl
+template <int> KW Tpl;
+// PRINT-CXX-NEXT: template <template <int> class, template <int> class = Tpl> [[KW]] SmearedTplDefArgs;
+template <template <int> class, template <int> class = Tpl> KW SmearedTplDefArgs;
+// PRINT-CXX-NEXT: template <template <int> class = Tpl, template <int> class> [[KW]] SmearedTplDefArgs;
+template <template <int> class = Tpl, template <int> class> KW SmearedTplDefArgs;
+
 #endif
diff --git a/clang/unittests/AST/DeclPrinterTest.cpp b/clang/unittests/AST/DeclPrinterTest.cpp
index 1a1b707c8dd37..a412a9813b470 100644
--- a/clang/unittests/AST/DeclPrinterTest.cpp
+++ b/clang/unittests/AST/DeclPrinterTest.cpp
@@ -1090,7 +1090,7 @@ TEST(DeclPrinter, TestClassTemplateDecl9) {
       "template<typename T> struct Z { };"
       "template<template<typename U> class T = Z> struct A { };",
       classTemplateDecl(hasName("A")).bind("id"),
-      "template <template <typename U> class T> struct A {}"));
+      "template <template <typename U> class T = Z> struct A {}"));
 }
 
 TEST(DeclPrinter, TestClassTemplateDecl10) {
>From 1d031ce443c7f2c2462f2dc73074b96d03e5afb6 Mon Sep 17 00:00:00 2001
From: Bolshakov <bolsh.andrey at yandex.ru>
Date: Tue, 7 Oct 2025 09:40:03 +0300
Subject: [PATCH 2/2] fixup! [clang][AST] Pretty-print default template
 template args
---
 clang/docs/ReleaseNotes.rst   |  4 +++-
 clang/lib/AST/DeclPrinter.cpp | 18 ++++++++++++------
 2 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index be585e4919b54..5e9a71e1e74d6 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -124,7 +124,9 @@ AST Dumping Potentially Breaking Changes
     ``__atomic_test_and_set(p, 0)``
 
 - Pretty-printing of templates with inherited (i.e. specified in a previous
-  redeclaration) and template default arguments has been fixed.
+  redeclaration) default arguments has been fixed.
+
+- Default arguments of template template parameters are pretty-printed now.
 
 Clang Frontend Potentially Breaking Changes
 -------------------------------------------
diff --git a/clang/lib/AST/DeclPrinter.cpp b/clang/lib/AST/DeclPrinter.cpp
index b2a837b82bb13..7f3dcca926cd3 100644
--- a/clang/lib/AST/DeclPrinter.cpp
+++ b/clang/lib/AST/DeclPrinter.cpp
@@ -111,6 +111,7 @@ namespace {
     void VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D);
     void VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *TTP);
     void VisitNonTypeTemplateParmDecl(const NonTypeTemplateParmDecl *NTTP);
+    void VisitTemplateTemplateParmDecl(const TemplateTemplateParmDecl *);
     void VisitHLSLBufferDecl(HLSLBufferDecl *D);
 
     void VisitOpenACCDeclareDecl(OpenACCDeclareDecl *D);
@@ -1189,12 +1190,7 @@ void DeclPrinter::printTemplateParameters(const TemplateParameterList *Params,
     } else if (auto NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
       VisitNonTypeTemplateParmDecl(NTTP);
     } else if (auto TTPD = dyn_cast<TemplateTemplateParmDecl>(Param)) {
-      VisitTemplateDecl(TTPD);
-      if (TTPD->hasDefaultArgument() && !TTPD->defaultArgumentWasInherited()) {
-        Out << " = ";
-        TTPD->getDefaultArgument().getArgument().print(Policy, Out,
-                                                       /*IncludeType=*/false);
-      }
+      VisitTemplateTemplateParmDecl(TTPD);
     }
   }
 
@@ -1920,6 +1916,16 @@ void DeclPrinter::VisitNonTypeTemplateParmDecl(
   }
 }
 
+void DeclPrinter::VisitTemplateTemplateParmDecl(
+    const TemplateTemplateParmDecl *TTPD) {
+  VisitTemplateDecl(TTPD);
+  if (TTPD->hasDefaultArgument() && !TTPD->defaultArgumentWasInherited()) {
+    Out << " = ";
+    TTPD->getDefaultArgument().getArgument().print(Policy, Out,
+                                                   /*IncludeType=*/false);
+  }
+}
+
 void DeclPrinter::VisitOpenACCDeclareDecl(OpenACCDeclareDecl *D) {
   if (!D->isInvalidDecl()) {
     Out << "#pragma acc declare";
    
    
More information about the cfe-commits
mailing list