Skip to content

Commit 24c475f

Browse files
HerrCai0907AlexisPerry
authored andcommitted
[clang-tidy] add fixhint for misc-use-internal-linkage (llvm#96203)
1 parent 9e94606 commit 24c475f

File tree

6 files changed

+82
-5
lines changed

6 files changed

+82
-5
lines changed

clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,26 @@
1818

1919
using namespace clang::ast_matchers;
2020

21+
namespace clang::tidy {
22+
23+
template <>
24+
struct OptionEnumMapping<misc::UseInternalLinkageCheck::FixModeKind> {
25+
static llvm::ArrayRef<
26+
std::pair<misc::UseInternalLinkageCheck::FixModeKind, StringRef>>
27+
getEnumMapping() {
28+
static constexpr std::pair<misc::UseInternalLinkageCheck::FixModeKind,
29+
StringRef>
30+
Mapping[] = {
31+
{misc::UseInternalLinkageCheck::FixModeKind::None, "None"},
32+
{misc::UseInternalLinkageCheck::FixModeKind::UseStatic,
33+
"UseStatic"},
34+
};
35+
return {Mapping};
36+
}
37+
};
38+
39+
} // namespace clang::tidy
40+
2141
namespace clang::tidy::misc {
2242

2343
namespace {
@@ -57,6 +77,16 @@ AST_POLYMORPHIC_MATCHER(isExternStorageClass,
5777

5878
} // namespace
5979

80+
UseInternalLinkageCheck::UseInternalLinkageCheck(StringRef Name,
81+
ClangTidyContext *Context)
82+
: ClangTidyCheck(Name, Context),
83+
HeaderFileExtensions(Context->getHeaderFileExtensions()),
84+
FixMode(Options.get("FixMode", FixModeKind::UseStatic)) {}
85+
86+
void UseInternalLinkageCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
87+
Options.store(Opts, "FixMode", FixMode);
88+
}
89+
6090
void UseInternalLinkageCheck::registerMatchers(MatchFinder *Finder) {
6191
auto Common =
6292
allOf(isFirstDecl(), isAllRedeclsInMainFile(HeaderFileExtensions),
@@ -82,11 +112,21 @@ static constexpr StringRef Message =
82112

83113
void UseInternalLinkageCheck::check(const MatchFinder::MatchResult &Result) {
84114
if (const auto *FD = Result.Nodes.getNodeAs<FunctionDecl>("fn")) {
85-
diag(FD->getLocation(), Message) << "function" << FD;
115+
DiagnosticBuilder DB = diag(FD->getLocation(), Message) << "function" << FD;
116+
SourceLocation FixLoc = FD->getTypeSpecStartLoc();
117+
if (FixLoc.isInvalid() || FixLoc.isMacroID())
118+
return;
119+
if (FixMode == FixModeKind::UseStatic)
120+
DB << FixItHint::CreateInsertion(FixLoc, "static ");
86121
return;
87122
}
88123
if (const auto *VD = Result.Nodes.getNodeAs<VarDecl>("var")) {
89-
diag(VD->getLocation(), Message) << "variable" << VD;
124+
DiagnosticBuilder DB = diag(VD->getLocation(), Message) << "variable" << VD;
125+
SourceLocation FixLoc = VD->getTypeSpecStartLoc();
126+
if (FixLoc.isInvalid() || FixLoc.isMacroID())
127+
return;
128+
if (FixMode == FixModeKind::UseStatic)
129+
DB << FixItHint::CreateInsertion(FixLoc, "static ");
90130
return;
91131
}
92132
llvm_unreachable("");

clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,22 @@ namespace clang::tidy::misc {
2020
/// http://clang.llvm.org/extra/clang-tidy/checks/misc/use-internal-linkage.html
2121
class UseInternalLinkageCheck : public ClangTidyCheck {
2222
public:
23-
UseInternalLinkageCheck(StringRef Name, ClangTidyContext *Context)
24-
: ClangTidyCheck(Name, Context),
25-
HeaderFileExtensions(Context->getHeaderFileExtensions()) {}
23+
UseInternalLinkageCheck(StringRef Name, ClangTidyContext *Context);
2624
void registerMatchers(ast_matchers::MatchFinder *Finder) override;
2725
void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
26+
void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
2827
std::optional<TraversalKind> getCheckTraversalKind() const override {
2928
return TK_IgnoreUnlessSpelledInSource;
3029
}
3130

31+
enum class FixModeKind {
32+
None,
33+
UseStatic,
34+
};
35+
3236
private:
3337
FileExtensionsSet HeaderFileExtensions;
38+
FixModeKind FixMode;
3439
};
3540

3641
} // namespace clang::tidy::misc

clang-tools-extra/docs/clang-tidy/checks/misc/use-internal-linkage.rst

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,16 @@ Example:
2525
}
2626
// already declared as extern
2727
extern int v2;
28+
29+
Options
30+
-------
31+
32+
.. option:: FixMode
33+
34+
Selects what kind of a fix the check should provide.
35+
36+
``None``
37+
Don't fix automatically.
38+
39+
``UseStatic``
40+
Add ``static`` for internal linkage variable and function.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// RUN: %check_clang_tidy %s misc-use-internal-linkage %t -- \
2+
// RUN: -config="{CheckOptions: {misc-use-internal-linkage.FixMode: 'None'}}" -- -I%S/Inputs/use-internal-linkage
3+
4+
void func() {}
5+
// CHECK-MESSAGES: :[[@LINE-1]]:6: warning: function 'func'
6+
// CHECK-FIXES-NOT: static void func() {}
7+
8+
int global;
9+
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: variable 'global'
10+
// CHECK-FIXES-NOT: static int global;

clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-func.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
11
// RUN: %check_clang_tidy %s misc-use-internal-linkage %t -- -- -I%S/Inputs/use-internal-linkage
2+
// RUN: %check_clang_tidy %s misc-use-internal-linkage %t -- \
3+
// RUN: -config="{CheckOptions: {misc-use-internal-linkage.FixMode: 'UseStatic'}}" -- -I%S/Inputs/use-internal-linkage
24

35
#include "func.h"
46

57
void func() {}
68
// CHECK-MESSAGES: :[[@LINE-1]]:6: warning: function 'func'
9+
// CHECK-FIXES: static void func() {}
710

811
template<class T>
912
void func_template() {}
1013
// CHECK-MESSAGES: :[[@LINE-1]]:6: warning: function 'func_template'
14+
// CHECK-FIXES: static void func_template() {}
1115

1216
void func_cpp_inc();
1317
// CHECK-MESSAGES: :[[@LINE-1]]:6: warning: function 'func_cpp_inc'
18+
// CHECK-FIXES: static void func_cpp_inc();
1419

1520
#include "func_cpp.inc"
1621

clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-var.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
// RUN: %check_clang_tidy %s misc-use-internal-linkage %t -- -- -I%S/Inputs/use-internal-linkage
2+
// RUN: %check_clang_tidy %s misc-use-internal-linkage %t -- \
3+
// RUN: -config="{CheckOptions: {misc-use-internal-linkage.FixMode: 'UseStatic'}}" -- -I%S/Inputs/use-internal-linkage
24

35
#include "var.h"
46

57
int global;
68
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: variable 'global'
9+
// CHECK-FIXES: static int global;
710

811
template<class T>
912
T global_template;
1013
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: variable 'global_template'
14+
// CHECK-FIXES: static T global_template;
1115

1216
int gloabl_header;
1317

0 commit comments

Comments
 (0)