[clang-tidy] Fix potential assert in use-noexcept check

Summary: Fix a potential assert in use-noexcept check if there is an issue getting the `TypeSourceInfo` as well as a small clean up.

Reviewers: aaron.ballman, alexfh, gribozavr2

Reviewed By: aaron.ballman

Subscribers: xazax.hun, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D80371
This commit is contained in:
Nathan James 2020-05-24 14:40:15 +01:00
parent c048a02b5b
commit 4c5818dd8c
3 changed files with 19 additions and 14 deletions

View File

@ -16,6 +16,10 @@ namespace clang {
namespace tidy {
namespace modernize {
namespace {
AST_MATCHER(NamedDecl, isValid) { return !Node.isInvalidDecl(); }
} // namespace
UseNoexceptCheck::UseNoexceptCheck(StringRef Name, ClangTidyContext *Context)
: ClangTidyCheck(Name, Context),
NoexceptMacro(Options.get("ReplacementString", "")),
@ -29,20 +33,12 @@ void UseNoexceptCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
void UseNoexceptCheck::registerMatchers(MatchFinder *Finder) {
Finder->addMatcher(
functionDecl(
cxxMethodDecl(
hasTypeLoc(loc(functionProtoType(hasDynamicExceptionSpec()))),
anyOf(hasOverloadedOperatorName("delete[]"),
hasOverloadedOperatorName("delete"), cxxDestructorDecl()))
.bind("del-dtor"))
.bind("funcDecl"),
this);
Finder->addMatcher(
functionDecl(
isValid(),
hasTypeLoc(loc(functionProtoType(hasDynamicExceptionSpec()))),
unless(anyOf(hasOverloadedOperatorName("delete[]"),
hasOverloadedOperatorName("delete"),
cxxDestructorDecl())))
optionally(cxxMethodDecl(anyOf(hasAnyOverloadedOperatorName(
"delete[]", "delete"),
cxxDestructorDecl()))
.bind("del-dtor")))
.bind("funcDecl"),
this);
@ -80,6 +76,9 @@ void UseNoexceptCheck::check(const MatchFinder::MatchResult &Result) {
.castAs<FunctionProtoTypeLoc>()
.getExceptionSpecRange();
}
assert(Range.isValid() && "Exception Source Range is invalid.");
CharSourceRange CRange = Lexer::makeFileCharRange(
CharSourceRange::getTokenRange(Range), *Result.SourceManager,
Result.Context->getLangOpts());

View File

@ -41,7 +41,7 @@ public:
private:
const std::string NoexceptMacro;
bool UseNoexceptFalse;
const bool UseNoexceptFalse;
};
} // namespace modernize

View File

@ -0,0 +1,6 @@
// RUN: %check_clang_tidy -expect-clang-tidy-error %s modernize-use-noexcept %t
// We're not interested in the check issuing a warning here, just making sure
// clang-tidy doesn't assert.
undefined_type doesThrow() throw();
// CHECK-MESSAGES: :[[@LINE-1]]:1: error: unknown type name 'undefined_type' [clang-diagnostic-error]