Author: Victor Chernyakin
Date: 2026-03-21T00:29:07-05:00
New Revision: 1087db5b1f80d1f5dc70a93c63d7ec8f19425b9b

URL: 
https://github.com/llvm/llvm-project/commit/1087db5b1f80d1f5dc70a93c63d7ec8f19425b9b
DIFF: 
https://github.com/llvm/llvm-project/commit/1087db5b1f80d1f5dc70a93c63d7ec8f19425b9b.diff

LOG: [clang-tidy] Speed up `bugprone-suspicious-semicolon` (#187558)

```txt
                   ---User Time---   --System Time--   --User+System--   
---Wall Time---  --- Name ---
Status quo:        0.4743 (100.0%)   0.3802 (100.0%)   0.8546 (100.0%)   0.8567 
(100.0%)  bugprone-suspicious-semicolon
With this change:  0.0103 (100.0%)   0.0027 (100.0%)   0.0130 (100.0%)   0.0133 
(100.0%)  bugprone-suspicious-semicolon
```
Continuing the trend of registering one `anyOf` matcher being slower
than registering each of its matchers separately (see #178829 for a
previous example).

(This PR also changes the traversal mode, but I only saw a small speedup
from that. Most of it came from registering the matchers separately.)

This check wasn't super expensive to begin with, but the speedup is
still pretty nice.

Added: 
    

Modified: 
    clang-tools-extra/clang-tidy/bugprone/SuspiciousSemicolonCheck.cpp
    clang-tools-extra/clang-tidy/bugprone/SuspiciousSemicolonCheck.h

Removed: 
    


################################################################################
diff  --git 
a/clang-tools-extra/clang-tidy/bugprone/SuspiciousSemicolonCheck.cpp 
b/clang-tools-extra/clang-tidy/bugprone/SuspiciousSemicolonCheck.cpp
index 94041c3260384..ee2a4638f0a5d 100644
--- a/clang-tools-extra/clang-tidy/bugprone/SuspiciousSemicolonCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/SuspiciousSemicolonCheck.cpp
@@ -16,14 +16,16 @@ using namespace clang::ast_matchers;
 namespace clang::tidy::bugprone {
 
 void SuspiciousSemicolonCheck::registerMatchers(MatchFinder *Finder) {
+  Finder->addMatcher(ifStmt(hasThen(nullStmt().bind("semi")),
+                            unless(hasElse(stmt())), unless(isConstexpr()))
+                         .bind("stmt"),
+                     this);
+  Finder->addMatcher(forStmt(hasBody(nullStmt().bind("semi"))).bind("stmt"),
+                     this);
   Finder->addMatcher(
-      stmt(anyOf(ifStmt(hasThen(nullStmt().bind("semi")),
-                        unless(hasElse(stmt())), unless(isConstexpr())),
-                 forStmt(hasBody(nullStmt().bind("semi"))),
-                 cxxForRangeStmt(hasBody(nullStmt().bind("semi"))),
-                 whileStmt(hasBody(nullStmt().bind("semi")))))
-          .bind("stmt"),
-      this);
+      cxxForRangeStmt(hasBody(nullStmt().bind("semi"))).bind("stmt"), this);
+  Finder->addMatcher(whileStmt(hasBody(nullStmt().bind("semi"))).bind("stmt"),
+                     this);
 }
 
 void SuspiciousSemicolonCheck::check(const MatchFinder::MatchResult &Result) {

diff  --git a/clang-tools-extra/clang-tidy/bugprone/SuspiciousSemicolonCheck.h 
b/clang-tools-extra/clang-tidy/bugprone/SuspiciousSemicolonCheck.h
index 10bdf328df0ff..e789d5bfa4cc1 100644
--- a/clang-tools-extra/clang-tidy/bugprone/SuspiciousSemicolonCheck.h
+++ b/clang-tools-extra/clang-tidy/bugprone/SuspiciousSemicolonCheck.h
@@ -24,6 +24,9 @@ class SuspiciousSemicolonCheck : public ClangTidyCheck {
       : ClangTidyCheck(Name, Context) {}
   void registerMatchers(ast_matchers::MatchFinder *Finder) override;
   void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
+  std::optional<TraversalKind> getCheckTraversalKind() const override {
+    return TK_IgnoreUnlessSpelledInSource;
+  }
 };
 
 } // namespace clang::tidy::bugprone


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to