diff --git a/clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp b/clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp index 5347dadf18ac5..ee400d88a3a74 100644 --- a/clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp +++ b/clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp @@ -448,14 +448,18 @@ void RenamerClangTidyCheck::addUsage( void RenamerClangTidyCheck::addUsage(const NamedDecl *Decl, SourceRange Range, const SourceManager *SourceMgr) { + // Don't keep track for non-identifier names. + auto *II = Decl->getIdentifier(); + if (!II) + return; if (const auto *Method = dyn_cast(Decl)) { if (const CXXMethodDecl *Overridden = getOverrideMethod(Method)) Decl = Overridden; } Decl = cast(Decl->getCanonicalDecl()); - return addUsage(RenamerClangTidyCheck::NamingCheckId(Decl->getLocation(), - Decl->getName()), - Range, SourceMgr); + return addUsage( + RenamerClangTidyCheck::NamingCheckId(Decl->getLocation(), II->getName()), + Range, SourceMgr); } void RenamerClangTidyCheck::checkNamedDecl(const NamedDecl *Decl, diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-bugfix.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-bugfix.cpp index 9f892ebceccf2..25f2c71a316d7 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-bugfix.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-bugfix.cpp @@ -3,3 +3,14 @@ // This used to cause a null pointer dereference. auto [left] = right; // CHECK-MESSAGES: :[[@LINE-1]]:15: error: use of undeclared identifier 'right' + +namespace crash_on_nonidentifiers { +struct Foo { + operator bool(); +}; +void foo() { + // Make sure we don't crash on non-identifier names (e.g. conversion + // operators). + if (Foo()) {} +} +}