DebugInfo: Correct printing empty template parameter packs
authorDavid Blaikie <dblaikie@gmail.com>
Mon, 30 Aug 2021 17:06:00 +0000 (10:06 -0700)
committerDavid Blaikie <dblaikie@gmail.com>
Mon, 30 Aug 2021 17:20:12 +0000 (10:20 -0700)
Empty packs in the non-final position would result in an extra ", ".
Empty packs in the final position would result in missing the space
between trailing >>.

clang/lib/AST/TypePrinter.cpp
clang/test/CodeGenCXX/debug-info-template.cpp

index b66e432..aef1e4f 100644 (file)
@@ -2052,20 +2052,21 @@ printTo(raw_ostream &OS, ArrayRef<TA> Args, const PrintingPolicy &Policy,
 
     // If the last character of our string is '>', add another space to
     // keep the two '>''s separate tokens.
-    NeedSpace = Policy.SplitTemplateClosers && !ArgString.empty() &&
-                ArgString.back() == '>';
-    FirstArg = false;
+    if (!ArgString.empty()) {
+      NeedSpace = Policy.SplitTemplateClosers && ArgString.back() == '>';
+      FirstArg = false;
+    }
 
     // Use same template parameter for all elements of Pack
     if (!IsPack)
       ParmIndex++;
   }
 
-  if (NeedSpace)
-    OS << ' ';
-
-  if (!IsPack)
+  if (!IsPack) {
+    if (NeedSpace)
+      OS << ' ';
     OS << '>';
+  }
 }
 
 void clang::printTemplateArgumentList(raw_ostream &OS,
index 0255ec9..2ce0166 100644 (file)
@@ -196,4 +196,22 @@ void f1() {
 }
 template void f1<t1<int>>();
 // CHECK: !DISubprogram(name: "f1<IndirectDefaultArgument::t1<int, int> >",
+} // namespace IndirectDefaultArgument
+
+namespace EmptyTrailingPack {
+template<typename T>
+struct t1 { };
+template<typename T, typename ...Ts>
+void f1() {
+}
+template void f1<t1<int>>();
+// CHECK: !DISubprogram(name: "f1<EmptyTrailingPack::t1<int> >",
+} // namespace EmptyTrailingPack
+
+namespace EmptyInnerPack {
+template<typename ...Ts, typename T = int>
+void f1() {
 }
+template void f1<>();
+// CHECK: !DISubprogram(name: "f1<int>",
+} // namespace EmptyInnerPack