Skip to content

Commit 31b84d4

Browse files
authored
[clang-tidy] Extend modernize-use-designated-initializers with new options (#94651)
Add StrictCStandardCompliance and StrictCppStandardCompliance options that default to true. Closes #83732
1 parent e329bfc commit 31b84d4

File tree

4 files changed

+41
-6
lines changed

4 files changed

+41
-6
lines changed

clang-tools-extra/clang-tidy/modernize/UseDesignatedInitializersCheck.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,14 @@ static constexpr bool RestrictToPODTypesDefault = false;
3232
static constexpr char IgnoreMacrosName[] = "IgnoreMacros";
3333
static constexpr bool IgnoreMacrosDefault = true;
3434

35+
static constexpr char StrictCStandardComplianceName[] =
36+
"StrictCStandardCompliance";
37+
static constexpr bool StrictCStandardComplianceDefault = true;
38+
39+
static constexpr char StrictCppStandardComplianceName[] =
40+
"StrictCppStandardCompliance";
41+
static constexpr bool StrictCppStandardComplianceDefault = true;
42+
3543
namespace {
3644

3745
struct Designators {
@@ -97,7 +105,12 @@ UseDesignatedInitializersCheck::UseDesignatedInitializersCheck(
97105
RestrictToPODTypes(
98106
Options.get(RestrictToPODTypesName, RestrictToPODTypesDefault)),
99107
IgnoreMacros(
100-
Options.getLocalOrGlobal(IgnoreMacrosName, IgnoreMacrosDefault)) {}
108+
Options.getLocalOrGlobal(IgnoreMacrosName, IgnoreMacrosDefault)),
109+
StrictCStandardCompliance(Options.get(StrictCStandardComplianceName,
110+
StrictCStandardComplianceDefault)),
111+
StrictCppStandardCompliance(
112+
Options.get(StrictCppStandardComplianceName,
113+
StrictCppStandardComplianceDefault)) {}
101114

102115
void UseDesignatedInitializersCheck::registerMatchers(MatchFinder *Finder) {
103116
const auto HasBaseWithFields =
@@ -179,6 +192,9 @@ void UseDesignatedInitializersCheck::storeOptions(
179192
IgnoreSingleElementAggregates);
180193
Options.store(Opts, RestrictToPODTypesName, RestrictToPODTypes);
181194
Options.store(Opts, IgnoreMacrosName, IgnoreMacros);
195+
Options.store(Opts, StrictCStandardComplianceName, StrictCStandardCompliance);
196+
Options.store(Opts, StrictCppStandardComplianceName,
197+
StrictCppStandardCompliance);
182198
}
183199

184200
} // namespace clang::tidy::modernize

clang-tools-extra/clang-tidy/modernize/UseDesignatedInitializersCheck.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,19 @@ class UseDesignatedInitializersCheck : public ClangTidyCheck {
2929
return TK_IgnoreUnlessSpelledInSource;
3030
}
3131

32+
bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
33+
return LangOpts.CPlusPlus20 || LangOpts.C99 ||
34+
(LangOpts.CPlusPlus && !StrictCppStandardCompliance) ||
35+
(!LangOpts.CPlusPlus && !LangOpts.ObjC &&
36+
!StrictCStandardCompliance);
37+
}
38+
3239
private:
3340
bool IgnoreSingleElementAggregates;
3441
bool RestrictToPODTypes;
3542
bool IgnoreMacros;
43+
bool StrictCStandardCompliance;
44+
bool StrictCppStandardCompliance;
3645
};
3746

3847
} // namespace clang::tidy::modernize

clang-tools-extra/docs/clang-tidy/checks/modernize/use-designated-initializers.rst

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ declaration of ``S``.
3737

3838
Even when compiling in a language version older than C++20, depending on your
3939
compiler, designated initializers are potentially supported. Therefore, the
40-
check is not restricted to C++20 and newer versions. Check out the options
40+
check is by default restricted to C99/C++20 and above. Check out the options
4141
``-Wc99-designator`` to get support for mixed designators in initializer list in
4242
C and ``-Wc++20-designator`` for support of designated initializers in older C++
4343
language modes.
@@ -60,3 +60,13 @@ Options
6060
The value `true` specifies that only Plain Old Data (POD) types shall be
6161
checked. This makes the check applicable to even older C++ standards. The
6262
default value is `false`.
63+
64+
.. option:: StrictCStandardCompliance
65+
66+
When set to `false`, the check will not restrict itself to C99 and above.
67+
The default value is `true`.
68+
69+
.. option:: StrictCppStandardCompliance
70+
71+
When set to `false`, the check will not restrict itself to C++20 and above.
72+
The default value is `true`.

clang-tools-extra/test/clang-tidy/checkers/modernize/use-designated-initializers.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
// RUN: %check_clang_tidy -std=c++17 %s modernize-use-designated-initializers %t \
1+
// RUN: %check_clang_tidy -std=c++20 %s modernize-use-designated-initializers %t \
22
// RUN: -- \
33
// RUN: -- -fno-delayed-template-parsing
4-
// RUN: %check_clang_tidy -check-suffixes=,SINGLE-ELEMENT -std=c++17 %s modernize-use-designated-initializers %t \
4+
// RUN: %check_clang_tidy -check-suffixes=,SINGLE-ELEMENT -std=c++20 %s modernize-use-designated-initializers %t \
55
// RUN: -- -config="{CheckOptions: {modernize-use-designated-initializers.IgnoreSingleElementAggregates: false}}" \
66
// RUN: -- -fno-delayed-template-parsing
7-
// RUN: %check_clang_tidy -check-suffixes=POD -std=c++17 %s modernize-use-designated-initializers %t \
7+
// RUN: %check_clang_tidy -check-suffixes=POD -std=c++20 %s modernize-use-designated-initializers %t \
88
// RUN: -- -config="{CheckOptions: {modernize-use-designated-initializers.RestrictToPODTypes: true}}" \
99
// RUN: -- -fno-delayed-template-parsing
10-
// RUN: %check_clang_tidy -check-suffixes=,MACROS -std=c++17 %s modernize-use-designated-initializers %t \
10+
// RUN: %check_clang_tidy -check-suffixes=,MACROS -std=c++20 %s modernize-use-designated-initializers %t \
1111
// RUN: -- -config="{CheckOptions: {modernize-use-designated-initializers.IgnoreMacros: false}}" \
1212
// RUN: -- -fno-delayed-template-parsing
1313

0 commit comments

Comments
 (0)