[clang-tools-extra] [clang-tidy] new check misc-use-internal-linkage (PR #90830)
Piotr Zegar via cfe-commits
cfe-commits at lists.llvm.org
Thu Jun 6 04:53:38 PDT 2024
================
@@ -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);
----------------
PiotrZSL wrote:
Still I would just assume that if first declaration isn't in header file, then such declaration could be considered to be internal. As include for header should be there anyway.
https://github.com/llvm/llvm-project/pull/90830
More information about the cfe-commits
mailing list