Author: Tom Eccles Date: 2022-04-22T13:03:28-04:00 New Revision: 225b91e6cbba31ff1ce787a152a67977d08fdcab
URL: https://github.com/llvm/llvm-project/commit/225b91e6cbba31ff1ce787a152a67977d08fdcab DIFF: https://github.com/llvm/llvm-project/commit/225b91e6cbba31ff1ce787a152a67977d08fdcab.diff LOG: 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. Added: Modified: clang/lib/AST/TypePrinter.cpp clang/unittests/AST/TypePrinterTest.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/TypePrinter.cpp b/clang/lib/AST/TypePrinter.cpp index 32ca7643a7603..d2feb1c10f06c 100644 --- a/clang/lib/AST/TypePrinter.cpp +++ b/clang/lib/AST/TypePrinter.cpp @@ -1467,8 +1467,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 7b44b1ecece24..12801a7018125 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> _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits