// 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,
}
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