diff options
-rw-r--r-- | clang/lib/AST/TypePrinter.cpp | 3 | ||||
-rw-r--r-- | clang/unittests/AST/TypePrinterTest.cpp | 16 |
2 files changed, 17 insertions, 2 deletions
diff --git a/clang/lib/AST/TypePrinter.cpp b/clang/lib/AST/TypePrinter.cpp index bba323f651aa..6e827530f41b 100644 --- a/clang/lib/AST/TypePrinter.cpp +++ b/clang/lib/AST/TypePrinter.cpp @@ -1466,8 +1466,7 @@ void TypePrinter::printTemplateId(const TemplateSpecializationType *T, if (!Policy.SuppressScope) AppendScope(TD->getDeclContext(), OS, TD->getDeclName()); - IdentifierInfo *II = TD->getIdentifier(); - OS << II->getName(); + OS << TD->getName(); } else { T->getTemplateName().print(OS, Policy); } diff --git a/clang/unittests/AST/TypePrinterTest.cpp b/clang/unittests/AST/TypePrinterTest.cpp index 8500d518d25f..d60ecedea95f 100644 --- a/clang/unittests/AST/TypePrinterTest.cpp +++ b/clang/unittests/AST/TypePrinterTest.cpp @@ -64,6 +64,22 @@ TEST(TypePrinter, TemplateId) { [](PrintingPolicy &Policy) { Policy.FullyQualifiedName = true; })); } +TEST(TypePrinter, TemplateId2) { + std::string Code = R"cpp( + template <template <typename ...> class TemplatedType> + void func(TemplatedType<int> Param); + )cpp"; + auto Matcher = parmVarDecl(hasType(qualType().bind("id"))); + + // Regression test ensuring we do not segfault getting the QualType as a + // string. + ASSERT_TRUE(PrintedTypeMatches(Code, {}, Matcher, "<int>", + [](PrintingPolicy &Policy) { + Policy.FullyQualifiedName = true; + Policy.PrintCanonicalTypes = true; + })); +} + TEST(TypePrinter, ParamsUglified) { llvm::StringLiteral Code = R"cpp( template <typename _Tp, template <typename> class __f> |