131b84d45SPiotr Zegar // RUN: %check_clang_tidy -std=c++20 %s modernize-use-designated-initializers %t \
2525fe449SDanny Mösch // RUN:     -- \
3525fe449SDanny Mösch // RUN:     -- -fno-delayed-template-parsing
431b84d45SPiotr Zegar // RUN: %check_clang_tidy -check-suffixes=,SINGLE-ELEMENT -std=c++20 %s modernize-use-designated-initializers %t \
5525fe449SDanny Mösch // RUN:     -- -config="{CheckOptions: {modernize-use-designated-initializers.IgnoreSingleElementAggregates: false}}" \
6525fe449SDanny Mösch // RUN:     -- -fno-delayed-template-parsing
731b84d45SPiotr Zegar // RUN: %check_clang_tidy -check-suffixes=POD -std=c++20 %s modernize-use-designated-initializers %t \
8525fe449SDanny Mösch // RUN:     -- -config="{CheckOptions: {modernize-use-designated-initializers.RestrictToPODTypes: true}}" \
9525fe449SDanny Mösch // RUN:     -- -fno-delayed-template-parsing
1031b84d45SPiotr Zegar // RUN: %check_clang_tidy -check-suffixes=,MACROS -std=c++20 %s modernize-use-designated-initializers %t \
11525fe449SDanny Mösch // RUN:     -- -config="{CheckOptions: {modernize-use-designated-initializers.IgnoreMacros: false}}" \
12525fe449SDanny Mösch // RUN:     -- -fno-delayed-template-parsing
13525fe449SDanny Mösch 
14525fe449SDanny Mösch struct S1 {};
15525fe449SDanny Mösch 
16525fe449SDanny Mösch S1 s11{};
17525fe449SDanny Mösch S1 s12 = {};
18525fe449SDanny Mösch S1 s13();
19525fe449SDanny Mösch S1 s14;
20525fe449SDanny Mösch 
21525fe449SDanny Mösch struct S2 { int i, j; };
22525fe449SDanny Mösch 
23525fe449SDanny Mösch S2 s21{.i=1, .j =2};
24525fe449SDanny Mösch 
25525fe449SDanny Mösch S2 s22 = {1, 2};
26525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use designated initializer list to initialize 'S2' [modernize-use-designated-initializers]
27525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-6]]:1: note: aggregate type is defined here
28525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-3]]:10: warning: use designated initializer list to initialize 'S2' [modernize-use-designated-initializers]
29525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-8]]:1: note: aggregate type is defined here
30525fe449SDanny Mösch // CHECK-FIXES: S2 s22 = {.i=1, .j=2};
31525fe449SDanny Mösch 
32525fe449SDanny Mösch S2 s23{1};
33525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use designated initializer list to initialize 'S2' [modernize-use-designated-initializers]
34525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-13]]:1: note: aggregate type is defined here
35525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-3]]:7: warning: use designated initializer list to initialize 'S2' [modernize-use-designated-initializers]
36525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-15]]:1: note: aggregate type is defined here
37525fe449SDanny Mösch // CHECK-FIXES: S2 s23{.i=1};
38525fe449SDanny Mösch 
39525fe449SDanny Mösch S2 s24{.i = 1};
40525fe449SDanny Mösch 
41525fe449SDanny Mösch S2 s25 = {.i=1, 2};
42525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: use designated init expression to initialize field 'j' [modernize-use-designated-initializers]
43525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-2]]:17: warning: use designated init expression to initialize field 'j' [modernize-use-designated-initializers]
44525fe449SDanny Mösch // CHECK-FIXES: S2 s25 = {.i=1, .j=2};
45525fe449SDanny Mösch 
46525fe449SDanny Mösch class S3 {
47525fe449SDanny Mösch   public:
48525fe449SDanny Mösch     S2 s2;
49525fe449SDanny Mösch     double d;
50525fe449SDanny Mösch };
51525fe449SDanny Mösch 
52525fe449SDanny Mösch S3 s31 = {.s2 = 1, 2, 3.1};
53525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: use designated init expression to initialize field 's2.j' [modernize-use-designated-initializers]
54525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-2]]:23: warning: use designated init expression to initialize field 'd' [modernize-use-designated-initializers]
55525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-3]]:20: warning: use designated init expression to initialize field 's2.j' [modernize-use-designated-initializers]
56525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-4]]:23: warning: use designated init expression to initialize field 'd' [modernize-use-designated-initializers]
57525fe449SDanny Mösch // CHECK-FIXES: S3 s31 = {.s2 = 1, .s2.j=2, .d=3.1};
58525fe449SDanny Mösch 
59525fe449SDanny Mösch S3 s32 = {{.i = 1, 2}};
60525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use designated initializer list to initialize 'S3' [modernize-use-designated-initializers]
61525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-15]]:1: note: aggregate type is defined here
62525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-3]]:20: warning: use designated init expression to initialize field 'j' [modernize-use-designated-initializers]
63525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-4]]:10: warning: use designated initializer list to initialize 'S3' [modernize-use-designated-initializers]
64525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-18]]:1: note: aggregate type is defined here
65525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-6]]:20: warning: use designated init expression to initialize field 'j' [modernize-use-designated-initializers]
66525fe449SDanny Mösch // CHECK-FIXES: S3 s32 = {.s2={.i = 1, .j=2}};
67525fe449SDanny Mösch 
68525fe449SDanny Mösch S3 s33 = {{2}, .d=3.1};
69525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: use designated init expression to initialize field 's2' [modernize-use-designated-initializers]
70525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-2]]:11: warning: use designated initializer list to initialize 'S2' [modernize-use-designated-initializers]
71525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-50]]:1: note: aggregate type is defined here
72525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-4]]:11: warning: use designated init expression to initialize field 's2' [modernize-use-designated-initializers]
73525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-5]]:11: warning: use designated initializer list to initialize 'S2' [modernize-use-designated-initializers]
74525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-53]]:1: note: aggregate type is defined here
75525fe449SDanny Mösch // CHECK-FIXES: S3 s33 = {.s2={.i=2}, .d=3.1};
76525fe449SDanny Mösch 
77525fe449SDanny Mösch struct S4 {
78525fe449SDanny Mösch     double d;
79525fe449SDanny Mösch     private: static int i;
80525fe449SDanny Mösch };
81525fe449SDanny Mösch 
82525fe449SDanny Mösch S4 s41 {2.2};
83525fe449SDanny Mösch // CHECK-MESSAGES-SINGLE-ELEMENT: :[[@LINE-1]]:8: warning: use designated initializer list to initialize 'S4' [modernize-use-designated-initializers]
84525fe449SDanny Mösch // CHECK-MESSAGES-SINGLE-ELEMENT: :[[@LINE-7]]:1: note: aggregate type is defined here
85525fe449SDanny Mösch // CHECK-FIXES-SINGLE-ELEMENT: S4 s41 {.d=2.2};
86525fe449SDanny Mösch 
87525fe449SDanny Mösch S4 s42 = {{}};
88525fe449SDanny Mösch // CHECK-MESSAGES-SINGLE-ELEMENT: :[[@LINE-1]]:10: warning: use designated initializer list to initialize 'S4' [modernize-use-designated-initializers]
89525fe449SDanny Mösch // CHECK-MESSAGES-SINGLE-ELEMENT: :[[@LINE-12]]:1: note: aggregate type is defined here
90525fe449SDanny Mösch // CHECK-FIXES-SINGLE-ELEMENT: S4 s42 = {.d={}};
91525fe449SDanny Mösch 
92525fe449SDanny Mösch template<typename S> S template1() { return {10, 11}; }
93525fe449SDanny Mösch 
94525fe449SDanny Mösch S2 s26 = template1<S2>();
95525fe449SDanny Mösch 
96525fe449SDanny Mösch template<typename S> S template2() { return {}; }
97525fe449SDanny Mösch 
98525fe449SDanny Mösch S2 s27 = template2<S2>();
99525fe449SDanny Mösch 
100525fe449SDanny Mösch struct S5: S2 { int x, y; };
101525fe449SDanny Mösch 
102525fe449SDanny Mösch S5 s51 {1, 2, .x = 3, .y = 4};
103525fe449SDanny Mösch 
104525fe449SDanny Mösch struct S6 {
105525fe449SDanny Mösch     int i;
106525fe449SDanny Mösch     struct { int j; } s;
107525fe449SDanny Mösch };
108525fe449SDanny Mösch 
109525fe449SDanny Mösch S6 s61 {1, 2};
110525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use designated initializer list to initialize 'S6' [modernize-use-designated-initializers]
111525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-7]]:1: note: aggregate type is defined here
112525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-3]]:8: warning: use designated initializer list to initialize 'S6' [modernize-use-designated-initializers]
113525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-9]]:1: note: aggregate type is defined here
114525fe449SDanny Mösch // CHECK-FIXES: S6 s61 {.i=1, .s.j=2};
115525fe449SDanny Mösch 
116525fe449SDanny Mösch struct S7 {
117525fe449SDanny Mösch     union {
118525fe449SDanny Mösch         int k;
119525fe449SDanny Mösch         double d;
120525fe449SDanny Mösch     } u;
121525fe449SDanny Mösch };
122525fe449SDanny Mösch 
123525fe449SDanny Mösch S7 s71 {1};
124525fe449SDanny Mösch // CHECK-MESSAGES-SINGLE-ELEMENT: :[[@LINE-1]]:8: warning: use designated initializer list to initialize 'S7' [modernize-use-designated-initializers]
125525fe449SDanny Mösch // CHECK-MESSAGES-SINGLE-ELEMENT: :[[@LINE-9]]:1: note: aggregate type is defined here
126525fe449SDanny Mösch // CHECK-FIXES-SINGLE-ELEMENT: S7 s71 {.u.k=1};
127525fe449SDanny Mösch 
128525fe449SDanny Mösch struct S8: S7 { int i; };
129525fe449SDanny Mösch 
130525fe449SDanny Mösch S8 s81{1, 2};
131525fe449SDanny Mösch 
132525fe449SDanny Mösch struct S9 {
133525fe449SDanny Mösch     int i, j;
134525fe449SDanny Mösch     S9 &operator=(S9);
135525fe449SDanny Mösch };
136525fe449SDanny Mösch 
137525fe449SDanny Mösch S9 s91{1, 2};
138525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use designated initializer list to initialize 'S9' [modernize-use-designated-initializers]
139525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-7]]:1: note: aggregate type is defined here
140525fe449SDanny Mösch // CHECK-FIXES: S9 s91{.i=1, .j=2};
141525fe449SDanny Mösch 
142525fe449SDanny Mösch struct S10 { int i = 1, j = 2; };
143525fe449SDanny Mösch 
144525fe449SDanny Mösch S10 s101 {1, .j=2};
145525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: use designated init expression to initialize field 'i' [modernize-use-designated-initializers]
146525fe449SDanny Mösch // CHECK-FIXES: S10 s101 {.i=1, .j=2};
147525fe449SDanny Mösch 
148525fe449SDanny Mösch struct S11 { int i; S10 s10; };
149525fe449SDanny Mösch 
150525fe449SDanny Mösch S11 s111 { .i = 1 };
151525fe449SDanny Mösch S11 s112 { 1 };
152525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use designated initializer list to initialize 'S11' [modernize-use-designated-initializers]
153525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-5]]:1: note: aggregate type is defined here
154525fe449SDanny Mösch // CHECK-FIXES: S11 s112 { .i=1 };
155525fe449SDanny Mösch 
156525fe449SDanny Mösch S11 s113 { .i=1, {}};
157525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: use designated init expression to initialize field 's10' [modernize-use-designated-initializers]
158525fe449SDanny Mösch // CHECK-FIXES: S11 s113 { .i=1, .s10={}};
159525fe449SDanny Mösch 
160525fe449SDanny Mösch S11 s114 { .i=1, .s10={1, .j=2}};
161525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: use designated init expression to initialize field 'i' [modernize-use-designated-initializers]
162525fe449SDanny Mösch // CHECK-FIXES: S11 s114 { .i=1, .s10={.i=1, .j=2}};
163525fe449SDanny Mösch 
164525fe449SDanny Mösch struct S12 {
165525fe449SDanny Mösch     int i;
166525fe449SDanny Mösch     struct { int j; };
167525fe449SDanny Mösch };
168525fe449SDanny Mösch 
169525fe449SDanny Mösch S12 s121 {1, 2};
170525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use designated initializer list to initialize 'S12' [modernize-use-designated-initializers]
171525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-7]]:1: note: aggregate type is defined here
172525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-3]]:10: warning: use designated initializer list to initialize 'S12' [modernize-use-designated-initializers]
173525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-9]]:1: note: aggregate type is defined here
174525fe449SDanny Mösch // CHECK-FIXES: S12 s121 {.i=1, .j=2};
175525fe449SDanny Mösch 
176525fe449SDanny Mösch struct S13 {
177525fe449SDanny Mösch     union {
178525fe449SDanny Mösch         int k;
179525fe449SDanny Mösch         double d;
180525fe449SDanny Mösch     };
181525fe449SDanny Mösch     int i;
182525fe449SDanny Mösch };
183525fe449SDanny Mösch 
184525fe449SDanny Mösch S13 s131 {1, 2};
185525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use designated initializer list to initialize 'S13' [modernize-use-designated-initializers]
186525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-10]]:1: note: aggregate type is defined here
187525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-3]]:10: warning: use designated initializer list to initialize 'S13' [modernize-use-designated-initializers]
188525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-12]]:1: note: aggregate type is defined here
189525fe449SDanny Mösch // CHECK-FIXES: S13 s131 {.k=1, .i=2};
190525fe449SDanny Mösch 
191525fe449SDanny Mösch #define A (3+2)
192525fe449SDanny Mösch #define B .j=1
193525fe449SDanny Mösch 
194525fe449SDanny Mösch S9 s92 {A, B};
195525fe449SDanny Mösch // CHECK-MESSAGES-MACROS: :[[@LINE-1]]:9: warning: use designated init expression to initialize field 'i' [modernize-use-designated-initializers]
196525fe449SDanny Mösch // CHECK-MESSAGES-MACROS: :[[@LINE-5]]:11: note: expanded from macro 'A'
197525fe449SDanny Mösch 
198525fe449SDanny Mösch #define DECLARE_S93 S9 s93 {1, 2}
199525fe449SDanny Mösch 
200525fe449SDanny Mösch DECLARE_S93;
201525fe449SDanny Mösch // CHECK-MESSAGES-MACROS: :[[@LINE-1]]:1: warning: use designated initializer list to initialize 'S9' [modernize-use-designated-initializers]
202525fe449SDanny Mösch // CHECK-MESSAGES-MACROS: :[[@LINE-4]]:28: note: expanded from macro 'DECLARE_S93'
203525fe449SDanny Mösch // CHECK-MESSAGES-MACROS: :[[@LINE-71]]:1: note: aggregate type is defined here
204*27ef549aSz1nke 
205*27ef549aSz1nke // Issue #113652.
206*27ef549aSz1nke struct S14;
207*27ef549aSz1nke 
208*27ef549aSz1nke struct S15{
209*27ef549aSz1nke   S15(S14& d):d{d}{}
210*27ef549aSz1nke   S14& d;
211*27ef549aSz1nke };
212