forked from OSchip/llvm-project
[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:
parent
c048a02b5b
commit
4c5818dd8c
|
@ -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());
|
||||
|
|
|
@ -41,7 +41,7 @@ public:
|
|||
|
||||
private:
|
||||
const std::string NoexceptMacro;
|
||||
bool UseNoexceptFalse;
|
||||
const bool UseNoexceptFalse;
|
||||
};
|
||||
|
||||
} // namespace modernize
|
||||
|
|
|
@ -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]
|
Loading…
Reference in New Issue