[clang] [clang-tools-extra] [clang-tidy] Avoid matching nodes in system headers (PR #151035)

Baranov Victor via cfe-commits cfe-commits at lists.llvm.org
Mon Jul 28 14:48:17 PDT 2025


================
@@ -1336,6 +1336,45 @@ class MatchASTVisitor : public RecursiveASTVisitor<MatchASTVisitor>,
     return false;
   }
 
+  bool isInSystemHeader(const SourceLocation &Loc) {
+    const SourceManager &SM = getASTContext().getSourceManager();
+    return SM.isInSystemHeader(Loc);
+  }
+
+  template <typename T> SourceLocation getNodeLocation(T const &Node) {
+    return Node.getBeginLoc();
+  }
+
+  SourceLocation getNodeLocation(QualType const &Node) { return {}; }
+
+  SourceLocation getNodeLocation(NestedNameSpecifier const &Node) { return {}; }
+
+  SourceLocation getNodeLocation(CXXCtorInitializer const &Node) {
+    return Node.getSourceLocation();
+  }
+
+  SourceLocation getNodeLocation(TemplateArgumentLoc const &Node) {
+    return Node.getLocation();
+  }
+
+  SourceLocation getNodeLocation(Attr const &Node) {
+    return Node.getLocation();
+  }
+
+  template <typename T>
+  auto shouldSkipNode(T const &Node)
+      -> std::enable_if_t<std::is_pointer_v<T>, bool> {
+    return (Node == nullptr) || shouldSkipNode(*Node);
+  }
+
+  template <typename T>
+  auto shouldSkipNode(T const &Node)
+      -> std::enable_if_t<!std::is_pointer_v<T>, bool> {
+    if (Options.IgnoreSystemHeaders && isInSystemHeader(getNodeLocation(Node)))
+      return true;
+    return false;
+  }
----------------
vbvictor wrote:

Could we use `if constexpr` and merge these 2 functions? IMO, it will be more readable.


https://github.com/llvm/llvm-project/pull/151035


More information about the cfe-commits mailing list