================
@@ -24,12 +24,28 @@ namespace {
 
 AST_MATCHER(Decl, isFirstDecl) { return Node.isFirstDecl(); }
 
-AST_MATCHER_P(Decl, isInMainFile, FileExtensionsSet, HeaderFileExtensions) {
+static bool isInMainFile(SourceLocation L, SourceManager &SM,
+                         const FileExtensionsSet &HeaderFileExtensions) {
+  for (;;) {
+    if (utils::isSpellingLocInHeaderFile(L, SM, HeaderFileExtensions))
+      return false;
+    if (SM.isInMainFile(L))
+      return true;
+    // not in header file but not in main file
+    L = SM.getIncludeLoc(SM.getFileID(L));
+    if (L.isValid())
+      continue;
+    // Conservative about the unknown
+    return false;
+  }
+}
+
+AST_MATCHER_P(Decl, isAllRedeclsInMainFile, FileExtensionsSet,
+              HeaderFileExtensions) {
   return llvm::all_of(Node.redecls(), [&](const Decl *D) {
-    SourceManager &SM = Finder->getASTContext().getSourceManager();
-    const SourceLocation L = D->getLocation();
-    return SM.isInMainFile(L) &&
-           !utils::isSpellingLocInHeaderFile(L, SM, HeaderFileExtensions);
+    return isInMainFile(D->getLocation(),
+                        Finder->getASTContext().getSourceManager(),
+                        HeaderFileExtensions);
----------------
HerrCai0907 wrote:

I prefer to tolerant some false negatives instead of introducing false 
positives for corner cases. It is more robust to check whether all redecls are 
in main file. And it will not cause performance issue since most of thing only 
have one declaration and one definition.

https://github.com/llvm/llvm-project/pull/90830
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to