summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Eccles <tom.eccles@codethink.co.uk>2022-04-22 13:03:28 -0400
committerTom Stellard <tstellar@redhat.com>2022-05-19 21:45:05 -0700
commit3bfae7816bdb5b09930f073f1eb99f72015d9f78 (patch)
tree406a0c46939070c7e9a4e3d272ac272cb005d4a8
parent76c1c1dd2a01fa2b2511cd0da3ec71d03addb107 (diff)
downloadllvm-3bfae7816bdb5b09930f073f1eb99f72015d9f78.tar.gz
Fix crash getting name of a template decl
NamedDecl::getIdentifier can return a nullptr when DeclarationName::isIdentifier is false, which leads to a null pointer dereference when TypePrinter::printTemplateId calls ->getName(). NamedDecl::getName does the same thing in the successful case and returns an empty string in the failure case. This crash affects the llvm 14 packages on llvm.org. (cherry picked from commit 225b91e6cbba31ff1ce787a152a67977d08fdcab)
-rw-r--r--clang/lib/AST/TypePrinter.cpp3
-rw-r--r--clang/unittests/AST/TypePrinterTest.cpp16
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>