diff options
author | Tom Eccles <tom.eccles@codethink.co.uk> | 2022-04-22 13:03:28 -0400 |
---|---|---|
committer | Aaron Ballman <aaron@aaronballman.com> | 2022-04-22 13:03:28 -0400 |
commit | 225b91e6cbba31ff1ce787a152a67977d08fdcab (patch) | |
tree | 53a9fcf52bd965fad88b9b21655b3cb7c2fb5faf | |
parent | e9a902c7f755a378e197c4b246a32859c0ee162d (diff) | |
download | llvm-225b91e6cbba31ff1ce787a152a67977d08fdcab.zip llvm-225b91e6cbba31ff1ce787a152a67977d08fdcab.tar.gz llvm-225b91e6cbba31ff1ce787a152a67977d08fdcab.tar.bz2 |
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.
-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 32ca764..d2feb1c 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 7b44b1e..12801a7 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> |