[clang-tidy] Fix potential assert in use-noexcept check
authorNathan James <n.james93@hotmail.co.uk>
Sun, 24 May 2020 13:40:15 +0000 (14:40 +0100)
committerNathan James <n.james93@hotmail.co.uk>
Sun, 24 May 2020 13:40:58 +0000 (14:40 +0100)
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

clang-tools-extra/clang-tidy/modernize/UseNoexceptCheck.cpp
clang-tools-extra/clang-tidy/modernize/UseNoexceptCheck.h
clang-tools-extra/test/clang-tidy/checkers/modernize-use-noexcept-error.cpp [new file with mode: 0644]

index bbda8d5..cc4bc05 100644 (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());
index 4f3ba32..b87d3e6 100644 (file)
@@ -41,7 +41,7 @@ public:
 
 private:
   const std::string NoexceptMacro;
-  bool UseNoexceptFalse;
+  const bool UseNoexceptFalse;
 };
 
 } // namespace modernize
diff --git a/clang-tools-extra/test/clang-tidy/checkers/modernize-use-noexcept-error.cpp b/clang-tools-extra/test/clang-tidy/checkers/modernize-use-noexcept-error.cpp
new file mode 100644 (file)
index 0000000..9a80b07
--- /dev/null
@@ -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]