[clang-tools-extra] [clang-tidy] new check misc-use-internal-linkage (PR #90830)
Piotr Zegar via cfe-commits
cfe-commits at lists.llvm.org
Tue May 21 11:59:34 PDT 2024
================
@@ -0,0 +1,78 @@
+//===--- UseInternalLinkageCheck.cpp - clang-tidy--------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "UseInternalLinkageCheck.h"
+#include "../utils/FileExtensionsUtils.h"
+#include "clang/AST/Decl.h"
+#include "clang/ASTMatchers/ASTMatchFinder.h"
+#include "clang/ASTMatchers/ASTMatchers.h"
+#include "clang/ASTMatchers/ASTMatchersMacros.h"
+#include "clang/Basic/SourceLocation.h"
+#include "clang/Basic/Specifiers.h"
+#include "llvm/ADT/STLExtras.h"
+
+using namespace clang::ast_matchers;
+
+namespace clang::tidy::misc {
+
+namespace {
+
+AST_MATCHER(Decl, isFirstDecl) { return Node.isFirstDecl(); }
+
+AST_MATCHER_P(Decl, isInMainFile, 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);
+ });
----------------
PiotrZSL wrote:
"because decl-1 is not in main file" but thats still source file and thats a point.
Take into account 2 use cases:
1. user want to run check on a header files, in such case header file will be a main file, and check wont work.
2. user want to run check on unity cpp, where there is single .cpp file generated by cmake that include other cpp files and those files include header files.
In both cases user should be able to do that.
You already got "allOf(isFirstDecl(), isInMainFile(HeaderFileExtensions)," and thats fine. so check should work only if first declaration is in source file (no additional header) or when declaration and definition is in header file, in such case adding static/anonymous namespace is also expected (but only if user explicitly want to run check on headers - by messing up with compile commands json for example).
https://github.com/llvm/llvm-project/pull/90830
More information about the cfe-commits
mailing list