Skip to content

Commit d5fa47a

Browse files
committed
Add option to restrict check to POD types
1 parent 728d776 commit d5fa47a

File tree

4 files changed

+38
-5
lines changed

4 files changed

+38
-5
lines changed

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

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ static const char *IgnoreSingleElementAggregatesName =
2626
"IgnoreSingleElementAggregates";
2727
static const bool IgnoreSingleElementAggregatesDefault = true;
2828

29+
static const char *RestrictToPODTypesName = "RestrictToPODTypes";
30+
static const bool RestrictToPODTypesDefault = false;
31+
2932
static std::vector<Stmt *>
3033
getUndesignatedComponents(const InitListExpr *SyntacticInitList) {
3134
std::vector<Stmt *> Result;
@@ -37,13 +40,16 @@ getUndesignatedComponents(const InitListExpr *SyntacticInitList) {
3740

3841
UseDesignatedInitializersCheck::UseDesignatedInitializersCheck(
3942
StringRef Name, ClangTidyContext *Context)
40-
: ClangTidyCheck(Name, Context),
41-
IgnoreSingleElementAggregates(
42-
Options.get(IgnoreSingleElementAggregatesName,
43-
IgnoreSingleElementAggregatesDefault)) {}
43+
: ClangTidyCheck(Name, Context), IgnoreSingleElementAggregates(Options.get(
44+
IgnoreSingleElementAggregatesName,
45+
IgnoreSingleElementAggregatesDefault)),
46+
RestrictToPODTypes(
47+
Options.get(RestrictToPODTypesName, RestrictToPODTypesDefault)) {}
4448

4549
AST_MATCHER(CXXRecordDecl, isAggregate) { return Node.isAggregate(); }
4650

51+
AST_MATCHER(CXXRecordDecl, isPOD) { return Node.isPOD(); }
52+
4753
AST_MATCHER(InitListExpr, isFullyDesignated) {
4854
return getUndesignatedComponents(&Node).empty();
4955
}
@@ -65,7 +71,8 @@ AST_MATCHER(FieldDecl, isAnonymousDecl) {
6571
void UseDesignatedInitializersCheck::registerMatchers(MatchFinder *Finder) {
6672
Finder->addMatcher(
6773
initListExpr(
68-
hasType(cxxRecordDecl(isAggregate(), unless(hasBaseWithFields()),
74+
hasType(cxxRecordDecl(RestrictToPODTypes ? isPOD() : isAggregate(),
75+
unless(hasBaseWithFields()),
6976
unless(has(fieldDecl(isAnonymousDecl()))))
7077
.bind("type")),
7178
unless(IgnoreSingleElementAggregates ? hasSingleElement()
@@ -98,6 +105,7 @@ void UseDesignatedInitializersCheck::storeOptions(
98105
ClangTidyOptions::OptionMap &Opts) {
99106
Options.store(Opts, IgnoreSingleElementAggregatesName,
100107
IgnoreSingleElementAggregates);
108+
Options.store(Opts, RestrictToPODTypesName, RestrictToPODTypes);
101109
}
102110

103111
} // namespace clang::tidy::modernize

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class UseDesignatedInitializersCheck : public ClangTidyCheck {
3232

3333
private:
3434
bool IgnoreSingleElementAggregates;
35+
bool RestrictToPODTypes;
3536
};
3637

3738
} // namespace clang::tidy::modernize

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,9 @@ Options
4646

4747
The value `false` specifies that even initializers for aggregate types
4848
with only a single element should be checked. The default value is `true`.
49+
50+
.. option:: RestrictToPODTypes
51+
52+
The value `true` specifies that only Plain Old Data (POD) types shall be
53+
checked. This makes the check applicable to even older C++ standards.
54+
The default value is `false`.

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
// RUN: %check_clang_tidy -check-suffixes=,SINGLE-ELEMENT -std=c++17 %s modernize-use-designated-initializers %t \
33
// RUN: -- -config="{CheckOptions: [{key: modernize-use-designated-initializers.IgnoreSingleElementAggregates, value: false}]}" \
44
// RUN: --
5+
// RUN: %check_clang_tidy -check-suffixes=POD -std=c++17 %s modernize-use-designated-initializers %t \
6+
// RUN: -- -config="{CheckOptions: [{key: modernize-use-designated-initializers.RestrictToPODTypes, value: true}]}" \
7+
// RUN: --
58

69
struct S1 {};
710

@@ -16,14 +19,17 @@ S2 s21{.i=1, .j =2};
1619

1720
S2 s22 = {1, 2};
1821
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use designated initializer list [modernize-use-designated-initializers]
22+
// CHECK-MESSAGES-POD: :[[@LINE-2]]:10: warning: use designated initializer list [modernize-use-designated-initializers]
1923

2024
S2 s23{1};
2125
// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use designated initializer list [modernize-use-designated-initializers]
26+
// CHECK-MESSAGES-POD: :[[@LINE-2]]:7: warning: use designated initializer list [modernize-use-designated-initializers]
2227

2328
S2 s24{.i = 1};
2429

2530
S2 s25 = {.i=1, 2};
2631
// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: use designated init expression [modernize-use-designated-initializers]
32+
// CHECK-MESSAGES-POD: :[[@LINE-2]]:17: warning: use designated init expression [modernize-use-designated-initializers]
2733

2834
class S3 {
2935
public:
@@ -34,10 +40,14 @@ class S3 {
3440
S3 s31 = {.s2 = 1, 2, 3.1};
3541
// CHECK-MESSAGES: :[[@LINE-1]]:20: warning: use designated init expression [modernize-use-designated-initializers]
3642
// CHECK-MESSAGES: :[[@LINE-2]]:23: warning: use designated init expression [modernize-use-designated-initializers]
43+
// CHECK-MESSAGES-POD: :[[@LINE-3]]:20: warning: use designated init expression [modernize-use-designated-initializers]
44+
// CHECK-MESSAGES-POD: :[[@LINE-4]]:23: warning: use designated init expression [modernize-use-designated-initializers]
3745

3846
S3 s32 = {{.i = 1, 2}};
3947
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use designated initializer list [modernize-use-designated-initializers]
4048
// CHECK-MESSAGES: :[[@LINE-2]]:20: warning: use designated init expression [modernize-use-designated-initializers]
49+
// CHECK-MESSAGES-POD: :[[@LINE-3]]:10: warning: use designated initializer list [modernize-use-designated-initializers]
50+
// CHECK-MESSAGES-POD: :[[@LINE-4]]:20: warning: use designated init expression [modernize-use-designated-initializers]
4151

4252
struct S4 {
4353
double d;
@@ -81,3 +91,11 @@ S7 s71 {1};
8191
struct S8: S7 { int i; };
8292

8393
S8 s81{1, 2};
94+
95+
struct S9 {
96+
int i, j;
97+
S9 &operator=(S9);
98+
};
99+
100+
S9 s91{1, 2};
101+
// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use designated initializer list [modernize-use-designated-initializers]

0 commit comments

Comments
 (0)