Skip to content

Commit 0afb303

Browse files
authored
[clang-tidy] Add handling of type aliases in use-designated-initializers check (#150842)
Resolves #150782.
1 parent 2e71bf0 commit 0afb303

File tree

3 files changed

+62
-5
lines changed

3 files changed

+62
-5
lines changed

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,11 @@ void UseDesignatedInitializersCheck::registerMatchers(MatchFinder *Finder) {
121121
hasAnyBase(hasType(cxxRecordDecl(has(fieldDecl()))));
122122
Finder->addMatcher(
123123
initListExpr(
124-
hasType(cxxRecordDecl(
125-
RestrictToPODTypes ? isPOD() : isAggregate(),
126-
unless(anyOf(HasBaseWithFields, hasName("::std::array"))))
127-
.bind("type")),
124+
hasType(hasUnqualifiedDesugaredType(recordType(hasDeclaration(
125+
cxxRecordDecl(
126+
RestrictToPODTypes ? isPOD() : isAggregate(),
127+
unless(anyOf(HasBaseWithFields, hasName("::std::array"))))
128+
.bind("type"))))),
128129
IgnoreSingleElementAggregates ? hasMoreThanOneElement() : anything(),
129130
unless(isFullyDesignated()))
130131
.bind("init"),
@@ -155,7 +156,7 @@ void UseDesignatedInitializersCheck::check(
155156
DiagnosticBuilder Diag =
156157
diag(InitList->getLBraceLoc(),
157158
"use designated initializer list to initialize %0");
158-
Diag << Type << InitList->getSourceRange();
159+
Diag << InitList->getType() << InitList->getSourceRange();
159160
for (const Stmt *InitExpr : *SyntacticInitList) {
160161
const auto Designator = Designators[InitExpr->getBeginLoc()];
161162
if (Designator && !Designator->empty())

clang-tools-extra/docs/ReleaseNotes.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,10 @@ Changes in existing checks
128128
- Improved :doc:`misc-header-include-cycle
129129
<clang-tidy/checks/misc/header-include-cycle>` check performance.
130130

131+
- Improved :doc:`modernize-use-designated-initializers
132+
<clang-tidy/checks/modernize/use-designated-initializers>` check to
133+
suggest using designated initializers for aliased aggregate types.
134+
131135
- Improved :doc:`modernize-use-std-format
132136
<clang-tidy/checks/modernize/use-std-format>` check to correctly match
133137
when the format string is converted to a different type by an implicit

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

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,3 +224,55 @@ std::array a{1,2,3};
224224
std::array<int,2> b{10, 11};
225225
using array = std::array<int, 2>;
226226
array c{10, 11};
227+
228+
struct S16 {
229+
int a;
230+
int b;
231+
};
232+
233+
using S17 = S16;
234+
235+
S17 s171{1, 2};
236+
// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: use designated initializer list to initialize 'S17' (aka 'S16') [modernize-use-designated-initializers]
237+
// CHECK-MESSAGES: :[[@LINE-9]]:1: note: aggregate type is defined here
238+
// CHECK-FIXES: S17 s171{.a=1, .b=2};
239+
// CHECK-MESSAGES-POD: :[[@LINE-4]]:9: warning: use designated initializer list to initialize 'S17' (aka 'S16') [modernize-use-designated-initializers]
240+
// CHECK-MESSAGES-POD: :[[@LINE-12]]:1: note: aggregate type is defined here
241+
// CHECK-FIXES-POD: S17 s171{.a=1, .b=2};
242+
243+
S17 s172{.a=1, 2};
244+
// CHECK-MESSAGES: :[[@LINE-1]]:16: warning: use designated init expression to initialize field 'b' [modernize-use-designated-initializers]
245+
// CHECK-MESSAGES-POD: :[[@LINE-2]]:16: warning: use designated init expression to initialize field 'b' [modernize-use-designated-initializers]
246+
// CHECK-FIXES: S17 s172{.a=1, .b=2};
247+
248+
S17 s173{.a=1, .b=2}; // no issue
249+
250+
typedef S16 S18;
251+
252+
S18 s181{1, 2};
253+
// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: use designated initializer list to initialize 'S18' (aka 'S16') [modernize-use-designated-initializers]
254+
// CHECK-MESSAGES-POD: :[[@LINE-2]]:9: warning: use designated initializer list to initialize 'S18' (aka 'S16') [modernize-use-designated-initializers]
255+
256+
S18 s182{1, .b=2};
257+
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use designated init expression to initialize field 'a' [modernize-use-designated-initializers]
258+
// CHECK-MESSAGES-POD: :[[@LINE-2]]:10: warning: use designated init expression to initialize field 'a' [modernize-use-designated-initializers]
259+
// CHECK-FIXES: S18 s182{.a=1, .b=2};
260+
261+
S18 s183{.a=1, .b=2}; // no issue
262+
263+
struct S19 {
264+
int i;
265+
S17 s17;
266+
S18 s18;
267+
};
268+
269+
S19 s191{1, {2, .b=3}, {4, 5}};
270+
// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: use designated initializer list to initialize 'S19' [modernize-use-designated-initializers]
271+
// CHECK-MESSAGES: :[[@LINE-8]]:1: note: aggregate type is defined here
272+
// CHECK-MESSAGES: :[[@LINE-3]]:14: warning: use designated init expression to initialize field 'a' [modernize-use-designated-initializers]
273+
// CHECK-MESSAGES: :[[@LINE-4]]:24: warning: use designated initializer list to initialize 'S18' (aka 'S16') [modernize-use-designated-initializers]
274+
// CHECK-MESSAGES-POD: :[[@LINE-5]]:9: warning: use designated initializer list to initialize 'S19' [modernize-use-designated-initializers]
275+
// CHECK-MESSAGES-POD: :[[@LINE-12]]:1: note: aggregate type is defined here
276+
// CHECK-MESSAGES-POD: :[[@LINE-7]]:14: warning: use designated init expression to initialize field 'a' [modernize-use-designated-initializers]
277+
// CHECK-MESSAGES-POD: :[[@LINE-8]]:24: warning: use designated initializer list to initialize 'S18' (aka 'S16') [modernize-use-designated-initializers]
278+
// CHECK-FIXES: S19 s191{.i=1, .s17={.a=2, .b=3}, .s18={.a=4, .b=5}};

0 commit comments

Comments
 (0)