Skip to content

Commit 421ae7b

Browse files
committed
[clang-tidy] Add fine-grained options to misc-use-internal-linkage
1 parent f60eec5 commit 421ae7b

File tree

9 files changed

+101
-31
lines changed

9 files changed

+101
-31
lines changed

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

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -109,10 +109,22 @@ UseInternalLinkageCheck::UseInternalLinkageCheck(StringRef Name,
109109
ClangTidyContext *Context)
110110
: ClangTidyCheck(Name, Context),
111111
HeaderFileExtensions(Context->getHeaderFileExtensions()),
112-
FixMode(Options.get("FixMode", FixModeKind::UseStatic)) {}
112+
FixMode(Options.get("FixMode", FixModeKind::UseStatic)),
113+
AnalyzeFunctions(Options.get("AnalyzeFunctions", true)),
114+
AnalyzeVariables(Options.get("AnalyzeVariables", true)),
115+
AnalyzeTypes(Options.get("AnalyzeTypes", true)) {
116+
if (!AnalyzeFunctions && !AnalyzeVariables && !AnalyzeTypes)
117+
configurationDiag(
118+
"the 'misc-use-internal-linkage' check will not perform any "
119+
"analysis because its 'AnalyzeFunctions', 'AnalyzeVariables', "
120+
"and 'AnalyzeTypes' options have all been set to false");
121+
}
113122

114123
void UseInternalLinkageCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
115124
Options.store(Opts, "FixMode", FixMode);
125+
Options.store(Opts, "AnalyzeFunctions", AnalyzeFunctions);
126+
Options.store(Opts, "AnalyzeVariables", AnalyzeVariables);
127+
Options.store(Opts, "AnalyzeTypes", AnalyzeTypes);
116128
}
117129

118130
void UseInternalLinkageCheck::registerMatchers(MatchFinder *Finder) {
@@ -125,24 +137,26 @@ void UseInternalLinkageCheck::registerMatchers(MatchFinder *Finder) {
125137
friendDecl(),
126138
// 3. module export decl
127139
exportDecl()))))));
128-
Finder->addMatcher(
129-
functionDecl(Common, hasBody(),
130-
unless(anyOf(isExternC(), isStaticStorageClass(),
131-
isExternStorageClass(),
132-
isExplicitTemplateSpecialization(),
133-
cxxMethodDecl(), isConsteval(),
134-
isAllocationOrDeallocationOverloadedFunction(),
135-
isMain())))
136-
.bind("fn"),
137-
this);
138-
Finder->addMatcher(varDecl(Common, hasGlobalStorage(),
139-
unless(anyOf(isExternC(), isStaticStorageClass(),
140-
isExternStorageClass(),
141-
isExplicitTemplateSpecialization(),
142-
hasThreadStorageDuration())))
143-
.bind("var"),
144-
this);
145-
if (getLangOpts().CPlusPlus)
140+
if (AnalyzeFunctions)
141+
Finder->addMatcher(
142+
functionDecl(
143+
Common, hasBody(),
144+
unless(anyOf(
145+
isExternC(), isStaticStorageClass(), isExternStorageClass(),
146+
isExplicitTemplateSpecialization(), cxxMethodDecl(),
147+
isConsteval(), isAllocationOrDeallocationOverloadedFunction(),
148+
isMain())))
149+
.bind("fn"),
150+
this);
151+
if (AnalyzeVariables)
152+
Finder->addMatcher(varDecl(Common, hasGlobalStorage(),
153+
unless(anyOf(isExternC(), isStaticStorageClass(),
154+
isExternStorageClass(),
155+
isExplicitTemplateSpecialization(),
156+
hasThreadStorageDuration())))
157+
.bind("var"),
158+
this);
159+
if (getLangOpts().CPlusPlus && AnalyzeTypes)
146160
Finder->addMatcher(
147161
tagDecl(Common, isDefinition(), hasNameForLinkage(),
148162
hasDeclContext(anyOf(translationUnitDecl(), namespaceDecl())),

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ class UseInternalLinkageCheck : public ClangTidyCheck {
3636
private:
3737
FileExtensionsSet HeaderFileExtensions;
3838
FixModeKind FixMode;
39+
const bool AnalyzeFunctions;
40+
const bool AnalyzeVariables;
41+
const bool AnalyzeTypes;
3942
};
4043

4144
} // namespace clang::tidy::misc

clang-tools-extra/docs/ReleaseNotes.rst

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -519,7 +519,9 @@ Changes in existing checks
519519

520520
- Improved :doc:`misc-use-internal-linkage
521521
<clang-tidy/checks/misc/use-internal-linkage>` to suggest giving
522-
structs, classes, unions, and enums internal linkage.
522+
user-defined types (structs, classes, unions, and enums) internal
523+
linkage. Added fine-grained options to control whether the check
524+
should diagnose functions, variables, and/or user-defined types.
523525

524526
- Improved :doc:`modernize-avoid-c-arrays
525527
<clang-tidy/checks/modernize/avoid-c-arrays>` to not diagnose array types

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ Example:
1717
int v1; // can be marked as static
1818

1919
void fn1() {} // can be marked as static
20-
20+
2121
struct S1 {}; // can be moved into anonymous namespace
2222

2323
namespace {
@@ -50,3 +50,16 @@ Options
5050

5151
- `UseStatic`
5252
Add ``static`` for internal linkage variable and function.
53+
54+
.. option:: AnalyzeFunctions
55+
56+
Whether to suggest giving functions internal linkage. Default is `true`.
57+
58+
.. option:: AnalyzeVariables
59+
60+
Whether to suggest giving variables internal linkage. Default is `true`.
61+
62+
.. option:: AnalyzeTypes
63+
64+
(C++-only) Whether to suggest giving user-defined types (structs,
65+
classes, unions, and enums) internal linkage. Default is `true`.

clang-tools-extra/test/clang-tidy/checkers/misc/Inputs/use-internal-linkage/tag.h renamed to clang-tools-extra/test/clang-tidy/checkers/misc/Inputs/use-internal-linkage/type.h

File renamed without changes.

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

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
1-
// RUN: %check_clang_tidy %s misc-use-internal-linkage %t -- -- -I%S/Inputs/use-internal-linkage
21
// 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
2+
// RUN: -config="{CheckOptions: { \
3+
// RUN: misc-use-internal-linkage.AnalyzeVariables: false, \
4+
// RUN: misc-use-internal-linkage.AnalyzeTypes: false \
5+
// RUN: }}" -- -I%S/Inputs/use-internal-linkage
6+
7+
// RUN: %check_clang_tidy %s misc-use-internal-linkage %t -- \
8+
// RUN: -config="{CheckOptions: { \
9+
// RUN: misc-use-internal-linkage.FixMode: 'UseStatic', \
10+
// RUN: misc-use-internal-linkage.AnalyzeVariables: false, \
11+
// RUN: misc-use-internal-linkage.AnalyzeTypes: false \
12+
// RUN: }}" -- -I%S/Inputs/use-internal-linkage
413

514
#include "func.h"
615

@@ -57,7 +66,6 @@ NNDS void func_nnds() {}
5766
void func_h_inc() {}
5867

5968
struct S {
60-
// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: struct 'S' can be moved into an anonymous namespace to enforce internal linkage
6169
void method();
6270
};
6371
void S::method() {}
@@ -96,3 +104,6 @@ void * operator new[](std::size_t) { return nullptr; }
96104
void operator delete(void*) noexcept {}
97105
void operator delete[](void*) noexcept {}
98106
// gh117489 end
107+
108+
int ignored_global = 0; // AnalyzeVariables is false.
109+
struct IgnoredStruct {}; // AnalyzeTypes is false.

clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-tag.cpp renamed to clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-type.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
1-
// RUN: %check_clang_tidy %s misc-use-internal-linkage %t -- -- -I%S/Inputs/use-internal-linkage
21
// 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
2+
// RUN: -config="{CheckOptions: { \
3+
// RUN: misc-use-internal-linkage.AnalyzeFunctions: false \
4+
// RUN: }}" -- -I%S/Inputs/use-internal-linkage
45

5-
#include "tag.h"
6+
// RUN: %check_clang_tidy %s misc-use-internal-linkage %t -- \
7+
// RUN: -config="{CheckOptions: { \
8+
// RUN: misc-use-internal-linkage.FixMode: 'UseStatic', \
9+
// RUN: misc-use-internal-linkage.AnalyzeFunctions: false \
10+
// RUN: }}" -- -I%S/Inputs/use-internal-linkage
11+
12+
#include "type.h"
613

714
struct StructDeclaredInHeader {};
815
union UnionDeclaredInHeader {};
@@ -56,7 +63,6 @@ struct OuterStruct {
5663
struct OuterStruct::InnerStructDefinedOutOfLine {};
5764

5865
void f() {
59-
// CHECK-MESSAGES: :[[@LINE-1]]:6: warning: function 'f' can be made static or moved into an anonymous namespace to enforce internal linkage
6066
struct StructInsideFunction {};
6167
}
6268

@@ -97,3 +103,5 @@ extern "C" {
97103
struct InExternCBlock { int i; };
98104

99105
}
106+
107+
void ignored_func() {} // AnalyzeFunctions is false.

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

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
1-
// RUN: %check_clang_tidy %s misc-use-internal-linkage %t -- -- -I%S/Inputs/use-internal-linkage
21
// 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
2+
// RUN: -config="{CheckOptions: { \
3+
// RUN: misc-use-internal-linkage.AnalyzeFunctions: false, \
4+
// RUN: misc-use-internal-linkage.AnalyzeTypes: false \
5+
// RUN: }}" -- -I%S/Inputs/use-internal-linkage
6+
7+
// RUN: %check_clang_tidy %s misc-use-internal-linkage %t -- \
8+
// RUN: -config="{CheckOptions: { \
9+
// RUN: misc-use-internal-linkage.FixMode: 'UseStatic', \
10+
// RUN: misc-use-internal-linkage.AnalyzeFunctions: false, \
11+
// RUN: misc-use-internal-linkage.AnalyzeTypes: false \
12+
// RUN: }}" -- -I%S/Inputs/use-internal-linkage
413

514
#include "var.h"
615

@@ -47,7 +56,6 @@ static void f(int para) {
4756
}
4857

4958
struct S {
50-
// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: struct 'S' can be moved into an anonymous namespace to enforce internal linkage
5159
int m1;
5260
static int m2;
5361
};
@@ -61,3 +69,6 @@ extern "C" int global_in_extern_c_2;
6169

6270
const int const_global = 123;
6371
constexpr int constexpr_global = 123;
72+
73+
struct IgnoredStruct {}; // AnalyzeTypes is false.
74+
void ignored_func() {} // AnalyzeFunctions is false.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// RUN: %check_clang_tidy %s misc-use-internal-linkage %t -- \
2+
// RUN: -config="{CheckOptions: { \
3+
// RUN: misc-use-internal-linkage.AnalyzeFunctions: false, \
4+
// RUN: misc-use-internal-linkage.AnalyzeVariables: false, \
5+
// RUN: misc-use-internal-linkage.AnalyzeTypes: false \
6+
// RUN: }}"
7+
8+
// CHECK-MESSAGES: warning: the 'misc-use-internal-linkage' check will not perform any analysis because its 'AnalyzeFunctions', 'AnalyzeVariables', and 'AnalyzeTypes' options have all been set to false [clang-tidy-config]

0 commit comments

Comments
 (0)