1 // RUN: %check_clang_tidy -std=c++11,c++14,c++17 %s modernize-use-default-member-init %t -- -- -fexceptions
2 // FIXME: Fix the checker to work in C++20 mode.
3
4 struct S {
5 };
6
7 struct PositiveValueChar {
PositiveValueCharPositiveValueChar8 PositiveValueChar() : c0(), c1()/*, c2(), c3()*/ {}
9 // CHECK-FIXES: PositiveValueChar() {}
10 const char c0;
11 // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: use default member initializer for 'c0' [modernize-use-default-member-init]
12 // CHECK-FIXES: const char c0{};
13 wchar_t c1;
14 // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: use default member initializer for 'c1'
15 // CHECK-FIXES: wchar_t c1{};
16 // FIXME: char16_t c2;
17 // C HECK-MESSAGES: :[[@LINE-1]]:12: warning: use default member initializer for 'c2'
18 // C HECK-FIXES: char16_t c2{};
19 // FIXME: char32_t c3;
20 // C HECK-MESSAGES: :[[@LINE-1]]:12: warning: use default member initializer for 'c3'
21 // C HECK-FIXES: char32_t c3{};
22 };
23
24 struct PositiveChar {
PositiveCharPositiveChar25 PositiveChar() : d('a') {}
26 // CHECK-FIXES: PositiveChar() {}
27 char d;
28 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use default member initializer for 'd'
29 // CHECK-FIXES: char d{'a'};
30 };
31
32 struct PositiveValueInt {
PositiveValueIntPositiveValueInt33 PositiveValueInt() : i() {}
34 // CHECK-FIXES: PositiveValueInt() {}
35 const int i;
36 // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use default member initializer for 'i'
37 // CHECK-FIXES: const int i{};
38 };
39
40 struct PositiveInt {
PositiveIntPositiveInt41 PositiveInt() : j(1) {}
42 // CHECK-FIXES: PositiveInt() {}
43 int j;
44 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'j'
45 // CHECK-FIXES: int j{1};
46 };
47
48 struct PositiveNotDefaultInt {
PositiveNotDefaultIntPositiveNotDefaultInt49 PositiveNotDefaultInt(int) : i(7) {}
50 // CHECK-FIXES: PositiveNotDefaultInt(int) {}
51 int i;
52 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'i'
53 // CHECK-FIXES: int i{7};
54 };
55
56 // We cannot reconcile these initializers.
57 struct TwoConstructors {
TwoConstructorsTwoConstructors58 TwoConstructors(int) : i(7) {}
TwoConstructorsTwoConstructors59 TwoConstructors(int, int) : i(8) {}
60 int i;
61 };
62
63 struct TwoConstructorsTpl {
TwoConstructorsTplTwoConstructorsTpl64 TwoConstructorsTpl() : i{7} {}
TwoConstructorsTplTwoConstructorsTpl65 template <typename T> TwoConstructorsTpl(T, int) : i(8) {}
66 int i;
67 };
68
69 struct PositiveNotDefaultOOLInt {
70 PositiveNotDefaultOOLInt(int);
71 int i;
72 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'i'
73 // CHECK-FIXES: int i{7};
74 };
75
PositiveNotDefaultOOLInt(int)76 PositiveNotDefaultOOLInt::PositiveNotDefaultOOLInt(int) : i(7) {}
77 // CHECK-FIXES: PositiveNotDefaultOOLInt::PositiveNotDefaultOOLInt(int) {}
78
79 struct PositiveNotDefaultOOLInt2 {
80 PositiveNotDefaultOOLInt2(int, int);
81 int i;
82 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'i'
83 // CHECK-FIXES: int i{7};
84 int j;
85 };
86
PositiveNotDefaultOOLInt2(int,int arg)87 PositiveNotDefaultOOLInt2::PositiveNotDefaultOOLInt2(int, int arg) : i(7), j(arg) {}
88 // CHECK-FIXES: PositiveNotDefaultOOLInt2::PositiveNotDefaultOOLInt2(int, int arg) : j(arg) {}
89
90 struct PositiveUnaryMinusInt {
PositiveUnaryMinusIntPositiveUnaryMinusInt91 PositiveUnaryMinusInt() : j(-1) {}
92 // CHECK-FIXES: PositiveUnaryMinusInt() {}
93 int j;
94 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'j'
95 // CHECK-FIXES: int j{-1};
96 };
97
98 struct PositiveUnaryPlusInt {
PositiveUnaryPlusIntPositiveUnaryPlusInt99 PositiveUnaryPlusInt() : j(+1) {}
100 // CHECK-FIXES: PositiveUnaryPlusInt() {}
101 int j;
102 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'j'
103 // CHECK-FIXES: int j{+1};
104 };
105
106 struct PositiveValueComplexInt {
PositiveValueComplexIntPositiveValueComplexInt107 PositiveValueComplexInt() : i() {}
108 // CHECK-FIXES: PositiveValueComplexInt() {}
109 _Complex int i;
110 // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: use default member initializer for 'i'
111 // CHECK-FIXES: _Complex int i{};
112 };
113
114 struct PositiveValueFloat {
PositiveValueFloatPositiveValueFloat115 PositiveValueFloat() : f() {}
116 // CHECK-FIXES: PositiveValueFloat() {}
117 float f;
118 // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: use default member initializer for 'f'
119 // CHECK-FIXES: float f{};
120 };
121
122 struct PositiveValueDouble {
PositiveValueDoublePositiveValueDouble123 PositiveValueDouble() : d() {}
124 // CHECK-FIXES: PositiveValueDouble() {}
125 double d;
126 // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use default member initializer for 'd'
127 // CHECK-FIXES: double d{};
128 };
129
130 struct PositiveDouble {
PositiveDoublePositiveDouble131 PositiveDouble() : f(2.5463e43) {}
132 // CHECK-FIXES: PositiveDouble() {}
133 double f;
134 // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use default member initializer for 'f'
135 // CHECK-FIXES: double f{2.5463e43};
136 };
137
138 struct PositiveValueComplexFloat {
PositiveValueComplexFloatPositiveValueComplexFloat139 PositiveValueComplexFloat() : f() {}
140 // CHECK-FIXES: PositiveValueComplexFloat() {}
141 _Complex float f;
142 // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: use default member initializer for 'f'
143 // CHECK-FIXES: _Complex float f{};
144 };
145
146 struct PositiveValueComplexDouble {
PositiveValueComplexDoublePositiveValueComplexDouble147 PositiveValueComplexDouble() : f() {}
148 // CHECK-FIXES: PositiveValueComplexDouble() {}
149 _Complex double f;
150 // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: use default member initializer for 'f'
151 // CHECK-FIXES: _Complex double f{};
152 };
153
154 struct PositiveUnaryMinusDouble {
PositiveUnaryMinusDoublePositiveUnaryMinusDouble155 PositiveUnaryMinusDouble() : f(-2.5463e43) {}
156 // CHECK-FIXES: PositiveUnaryMinusDouble() {}
157 double f;
158 // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use default member initializer for 'f'
159 // CHECK-FIXES: double f{-2.5463e43};
160 };
161
162 struct PositiveUnaryPlusDouble {
PositiveUnaryPlusDoublePositiveUnaryPlusDouble163 PositiveUnaryPlusDouble() : f(+2.5463e43) {}
164 // CHECK-FIXES: PositiveUnaryPlusDouble() {}
165 double f;
166 // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use default member initializer for 'f'
167 // CHECK-FIXES: double f{+2.5463e43};
168 };
169
170 struct PositiveValueBool {
PositiveValueBoolPositiveValueBool171 PositiveValueBool() : b() {}
172 // CHECK-FIXES: PositiveValueBool() {}
173 bool b;
174 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use default member initializer for 'b'
175 // CHECK-FIXES: bool b{};
176 };
177
178 struct PositiveBool {
PositiveBoolPositiveBool179 PositiveBool() : a(true) {}
180 // CHECK-FIXES: PositiveBool() {}
181 bool a;
182 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use default member initializer for 'a'
183 // CHECK-FIXES: bool a{true};
184 };
185
186 struct PositiveValuePointer {
PositiveValuePointerPositiveValuePointer187 PositiveValuePointer() : p() {}
188 // CHECK-FIXES: PositiveValuePointer() {}
189 int *p;
190 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use default member initializer for 'p'
191 // CHECK-FIXES: int *p{};
192 };
193
194 struct PositiveNullPointer {
PositiveNullPointerPositiveNullPointer195 PositiveNullPointer() : q(nullptr) {}
196 // CHECK-FIXES: PositiveNullPointer() {}
197 int *q;
198 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use default member initializer for 'q'
199 // CHECK-FIXES: int *q{nullptr};
200 };
201
202 enum Enum { Foo, Bar };
203 struct PositiveEnum {
PositiveEnumPositiveEnum204 PositiveEnum() : e(Foo) {}
205 // CHECK-FIXES: PositiveEnum() {}
206 Enum e;
207 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use default member initializer for 'e'
208 // CHECK-FIXES: Enum e{Foo};
209 };
210
211 struct PositiveValueEnum {
PositiveValueEnumPositiveValueEnum212 PositiveValueEnum() : e() {}
213 // CHECK-FIXES: PositiveValueEnum() {}
214 Enum e;
215 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use default member initializer for 'e'
216 // CHECK-FIXES: Enum e{};
217 };
218
219 struct PositiveString {
PositiveStringPositiveString220 PositiveString() : s("foo") {}
221 // CHECK-FIXES: PositiveString() {}
222 const char *s;
223 // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: use default member initializer for 's'
224 // CHECK-FIXES: const char *s{"foo"};
225 };
226
227 struct PositiveStruct {
PositiveStructPositiveStruct228 PositiveStruct() : s(7) {}
229 // CHECK-FIXES: PositiveStruct() {}
230 struct {
231 int s;
232 // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: use default member initializer for 's'
233 // CHECK-FIXES: int s{7};
234 };
235 };
236
237 template <typename T>
238 struct NegativeTemplate {
NegativeTemplateNegativeTemplate239 NegativeTemplate() : t() {}
240 T t;
241 };
242
243 NegativeTemplate<int> nti;
244 NegativeTemplate<double> ntd;
245
246 struct NegativeDefaultMember {
NegativeDefaultMemberNegativeDefaultMember247 NegativeDefaultMember() {}
248 int i = 2;
249 };
250
251 struct NegativeClass : S {
NegativeClassNegativeClass252 NegativeClass() : s() {}
253 S s;
254 };
255
256 struct NegativeBase : S {
NegativeBaseNegativeBase257 NegativeBase() : S() {}
258 };
259
260 struct NegativeDefaultOtherMember{
NegativeDefaultOtherMemberNegativeDefaultOtherMember261 NegativeDefaultOtherMember() : i(3) {}
262 int i = 4;
263 };
264
265 struct NegativeUnion {
NegativeUnionNegativeUnion266 NegativeUnion() : d(5.0) {}
267 union {
268 int i;
269 double d;
270 };
271 };
272
273 struct NegativeBitField
274 {
NegativeBitFieldNegativeBitField275 NegativeBitField() : i(6) {}
276 int i : 5;
277 };
278
279 struct NegativeDefaultArg
280 {
NegativeDefaultArgNegativeDefaultArg281 NegativeDefaultArg(int i = 4) : i(i) {}
282 int i;
283 };
284
285 struct ExistingChar {
ExistingCharExistingChar286 ExistingChar(short) : e1(), e2{}, e3(), e4() {}
287 // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: member initializer for 'e1' is redundant [modernize-use-default-member-init]
288 // CHECK-MESSAGES: :[[@LINE-2]]:31: warning: member initializer for 'e2' is redundant
289 // CHECK-MESSAGES: :[[@LINE-3]]:37: warning: member initializer for 'e3' is redundant
290 // CHECK-FIXES: ExistingChar(short) : e4() {}
ExistingCharExistingChar291 ExistingChar(int) : e1(0), e2{0}, e3(0), e4(0) {}
292 // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: member initializer for 'e1' is redundant
293 // CHECK-MESSAGES: :[[@LINE-2]]:30: warning: member initializer for 'e2' is redundant
294 // CHECK-MESSAGES: :[[@LINE-3]]:37: warning: member initializer for 'e3' is redundant
295 // CHECK-FIXES: ExistingChar(int) : e4(0) {}
ExistingCharExistingChar296 ExistingChar(long) : e1('\0'), e2{'\0'}, e3('\0'), e4('\0') {}
297 // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: member initializer for 'e1' is redundant
298 // CHECK-MESSAGES: :[[@LINE-2]]:34: warning: member initializer for 'e2' is redundant
299 // CHECK-MESSAGES: :[[@LINE-3]]:44: warning: member initializer for 'e3' is redundant
300 // CHECK-FIXES: ExistingChar(long) : e4('\0') {}
ExistingCharExistingChar301 ExistingChar(char) : e1('a'), e2{'a'}, e3('a'), e4('a') {}
302 // CHECK-MESSAGES: :[[@LINE-1]]:51: warning: member initializer for 'e4' is redundant
303 // CHECK-FIXES: ExistingChar(char) : e1('a'), e2{'a'}, e3('a') {}
304 char e1{};
305 char e2 = 0;
306 char e3 = '\0';
307 char e4 = 'a';
308 };
309
310 struct ExistingInt {
ExistingIntExistingInt311 ExistingInt(short) : e1(), e2{}, e3(), e4(), e5(), e6() {}
312 // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: member initializer for 'e1' is redundant [modernize-use-default-member-init]
313 // CHECK-MESSAGES: :[[@LINE-2]]:30: warning: member initializer for 'e2' is redundant
314 // CHECK-FIXES: ExistingInt(short) : e3(), e4(), e5(), e6() {}
ExistingIntExistingInt315 ExistingInt(int) : e1(0), e2{0}, e3(0), e4(0), e5(0), e6(0) {}
316 // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: member initializer for 'e1' is redundant
317 // CHECK-MESSAGES: :[[@LINE-2]]:29: warning: member initializer for 'e2' is redundant
318 // CHECK-FIXES: ExistingInt(int) : e3(0), e4(0), e5(0), e6(0) {}
ExistingIntExistingInt319 ExistingInt(long) : e1(5), e2{5}, e3(5), e4(5), e5(5), e6(5) {}
320 // CHECK-MESSAGES: :[[@LINE-1]]:37: warning: member initializer for 'e3' is redundant
321 // CHECK-MESSAGES: :[[@LINE-2]]:44: warning: member initializer for 'e4' is redundant
322 // CHECK-MESSAGES: :[[@LINE-3]]:58: warning: member initializer for 'e6' is redundant
323 // CHECK-FIXES: ExistingInt(long) : e1(5), e2{5}, e5(5) {}
ExistingIntExistingInt324 ExistingInt(char) : e1(-5), e2{-5}, e3(-5), e4(-5), e5(-5), e6(-5) {}
325 // CHECK-MESSAGES: :[[@LINE-1]]:55: warning: member initializer for 'e5' is redundant
326 // CHECK-FIXES: ExistingInt(char) : e1(-5), e2{-5}, e3(-5), e4(-5), e6(-5) {}
327 int e1{};
328 int e2 = 0;
329 int e3 = {5};
330 int e4{5};
331 int e5 = -5;
332 int e6 = +5;
333 };
334
335 struct ExistingDouble {
ExistingDoubleExistingDouble336 ExistingDouble(short) : e1(), e2{}, e3(), e4(), e5() {}
337 // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: member initializer for 'e1' is redundant
338 // CHECK-MESSAGES: :[[@LINE-2]]:33: warning: member initializer for 'e2' is redundant
339 // CHECK-FIXES: ExistingDouble(short) : e3(), e4(), e5() {}
ExistingDoubleExistingDouble340 ExistingDouble(int) : e1(0.0), e2{0.0}, e3(0.0), e4(0.0), e5(0.0) {}
341 // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: member initializer for 'e1' is redundant
342 // CHECK-MESSAGES: :[[@LINE-2]]:34: warning: member initializer for 'e2' is redundant
343 // CHECK-FIXES: ExistingDouble(int) : e3(0.0), e4(0.0), e5(0.0) {}
ExistingDoubleExistingDouble344 ExistingDouble(long) : e1(5.0), e2{5.0}, e3(5.0), e4(5.0), e5(5.0) {}
345 // CHECK-MESSAGES: :[[@LINE-1]]:44: warning: member initializer for 'e3' is redundant
346 // CHECK-MESSAGES: :[[@LINE-2]]:62: warning: member initializer for 'e5' is redundant
347 // CHECK-FIXES: ExistingDouble(long) : e1(5.0), e2{5.0}, e4(5.0) {}
ExistingDoubleExistingDouble348 ExistingDouble(char) : e1(-5.0), e2{-5.0}, e3(-5.0), e4(-5.0), e5(-5.0) {}
349 // CHECK-MESSAGES: :[[@LINE-1]]:56: warning: member initializer for 'e4' is redundant
350 // CHECK-FIXES: ExistingDouble(char) : e1(-5.0), e2{-5.0}, e3(-5.0), e5(-5.0) {}
351 double e1{};
352 double e2 = 0.0;
353 double e3 = 5.0;
354 double e4{-5.0};
355 double e5 = +5.0;
356 };
357
358 struct ExistingBool {
ExistingBoolExistingBool359 ExistingBool(short) : e1(), e2{}, e3() {}
360 // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: member initializer for 'e1' is redundant
361 // CHECK-MESSAGES: :[[@LINE-2]]:31: warning: member initializer for 'e2' is redundant
362 // CHECK-FIXES: ExistingBool(short) : e3() {}
ExistingBoolExistingBool363 ExistingBool(int) : e1(false), e2{false}, e3(false) {}
364 // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: member initializer for 'e1' is redundant
365 // CHECK-MESSAGES: :[[@LINE-2]]:34: warning: member initializer for 'e2' is redundant
366 // CHECK-FIXES: ExistingBool(int) : e3(false) {}
ExistingBoolExistingBool367 ExistingBool(long) : e1(true), e2{true}, e3(true) {}
368 // CHECK-MESSAGES: :[[@LINE-1]]:44: warning: member initializer for 'e3' is redundant
369 // CHECK-FIXES: ExistingBool(long) : e1(true), e2{true} {}
370 bool e1{};
371 bool e2 = false;
372 bool e3{true};
373 };
374
375 struct ExistingEnum {
ExistingEnumExistingEnum376 ExistingEnum(short) : e1(Foo), e2{Foo} {}
377 // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: member initializer for 'e1' is redundant
378 // CHECK-FIXES: ExistingEnum(short) : e2{Foo} {}
ExistingEnumExistingEnum379 ExistingEnum(int) : e1(Bar), e2{Bar} {}
380 // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: member initializer for 'e2' is redundant
381 // CHECK-FIXES: ExistingEnum(int) : e1(Bar) {}
382 Enum e1 = Foo;
383 Enum e2{Bar};
384 };
385
386 struct ExistingPointer {
ExistingPointerExistingPointer387 ExistingPointer(short) : e1(), e2{}, e3(), e4() {}
388 // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: member initializer for 'e1' is redundant
389 // CHECK-MESSAGES: :[[@LINE-2]]:34: warning: member initializer for 'e2' is redundant
390 // CHECK-MESSAGES: :[[@LINE-3]]:40: warning: member initializer for 'e3' is redundant
391 // CHECK-FIXES: ExistingPointer(short) : e4() {}
ExistingPointerExistingPointer392 ExistingPointer(int) : e1(0), e2{0}, e3(0), e4(&e1) {}
393 // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: member initializer for 'e1' is redundant
394 // CHECK-MESSAGES: :[[@LINE-2]]:33: warning: member initializer for 'e2' is redundant
395 // CHECK-MESSAGES: :[[@LINE-3]]:40: warning: member initializer for 'e3' is redundant
396 // CHECK-FIXES: ExistingPointer(int) : e4(&e1) {}
ExistingPointerExistingPointer397 ExistingPointer(long) : e1(nullptr), e2{nullptr}, e3(nullptr), e4(&e2) {}
398 // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: member initializer for 'e1' is redundant
399 // CHECK-MESSAGES: :[[@LINE-2]]:40: warning: member initializer for 'e2' is redundant
400 // CHECK-MESSAGES: :[[@LINE-3]]:53: warning: member initializer for 'e3' is redundant
401 // CHECK-FIXES: ExistingPointer(long) : e4(&e2) {}
402 int *e1{};
403 int *e2 = 0;
404 int *e3{nullptr};
405 int **e4 = &e1;
406 };
407
408 struct ExistingString {
ExistingStringExistingString409 ExistingString(short) : e1(), e2{}, e3(), e4() {}
410 // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: member initializer for 'e1' is redundant [modernize-use-default-member-init]
411 // CHECK-MESSAGES: :[[@LINE-2]]:33: warning: member initializer for 'e2' is redundant
412 // CHECK-FIXES: ExistingString(short) : e3(), e4() {}
ExistingStringExistingString413 ExistingString(int) : e1(0), e2{0}, e3(0), e4(0) {}
414 // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: member initializer for 'e1' is redundant
415 // CHECK-MESSAGES: :[[@LINE-2]]:32: warning: member initializer for 'e2' is redundant
416 // CHECK-FIXES: ExistingString(int) : e3(0), e4(0) {}
ExistingStringExistingString417 ExistingString(long) : e1(nullptr), e2{nullptr}, e3(nullptr), e4(nullptr) {}
418 // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: member initializer for 'e1' is redundant
419 // CHECK-MESSAGES: :[[@LINE-2]]:39: warning: member initializer for 'e2' is redundant
420 // CHECK-FIXES: ExistingString(long) : e3(nullptr), e4(nullptr) {}
ExistingStringExistingString421 ExistingString(char) : e1("foo"), e2{"foo"}, e3("foo"), e4("foo") {}
422 // CHECK-MESSAGES: :[[@LINE-1]]:48: warning: member initializer for 'e3' is redundant
423 // CHECK-FIXES: ExistingString(char) : e1("foo"), e2{"foo"}, e4("foo") {}
424 const char *e1{};
425 const char *e2 = nullptr;
426 const char *e3 = "foo";
427 const char *e4 = "bar";
428 };
429
430 struct UnionExisting {
UnionExistingUnionExisting431 UnionExisting() : e(5.0) {}
432 // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: member initializer for 'e' is redundant
433 // CHECK-FIXES: UnionExisting() {}
434 union {
435 int i;
436 double e = 5.0;
437 };
438 };
439
440 template <typename T>
441 struct NegativeTemplateExisting {
NegativeTemplateExistingNegativeTemplateExisting442 NegativeTemplateExisting(int) : t(0) {}
443 T t{};
444 };
445
446 NegativeTemplateExisting<int> ntei(0);
447 NegativeTemplateExisting<double> nted(0);
448
449 // This resulted in a warning by default.
450 #define MACRO() \
451 struct MacroS { \
452 void *P; \
453 MacroS() : P(nullptr) {} \
454 };
455
456 MACRO();
457
458
459 class FunctionTryBlock {
460 public:
FunctionTryBlock()461 FunctionTryBlock() try : i(5), k(8) {}
462 // CHECK-FIXES: FunctionTryBlock() try {}
463 catch (...) {}
464
465 private:
466 int i, k;
467 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'i' [modernize-use-default-member-init]
468 // CHECK-MESSAGES: :[[@LINE-2]]:10: warning: use default member initializer for 'k' [modernize-use-default-member-init]
469 // CHECK-FIXES: int i{5}, k{8};
470 };
471
472 struct PR45363 {
473 // Ensure no warning is emitted here
PR45363PR45363474 PR45363(int i = 0) : m_i{i} {}
475 int m_i;
476 };
477
478 struct EmptyBracedIntDefault {
EmptyBracedIntDefaultEmptyBracedIntDefault479 EmptyBracedIntDefault() : m_i{} {}
480 int m_i;
481 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'm_i' [modernize-use-default-member-init]
482 // CHECK-FIXES: {{^ }}EmptyBracedIntDefault() {}
483 // CHECK-FIXES-NEXT: {{^ }}int m_i{};
484 };
485
486 namespace PR63285 {
487
488 class ArrayValueInit {
ArrayValueInit()489 ArrayValueInit() : m_array() {}
490 double m_array[1];
491 // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use default member initializer for 'm_array' [modernize-use-default-member-init]
492 // CHECK-FIXES: {{^ }}ArrayValueInit() {}
493 // CHECK-FIXES-NEXT: {{^ }}double m_array[1]{};
494 };
495
496 class ArrayBraceInit {
ArrayBraceInit()497 ArrayBraceInit() : m_array{} {}
498 double m_array[1];
499 // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use default member initializer for 'm_array' [modernize-use-default-member-init]
500 // CHECK-FIXES: {{^ }}ArrayBraceInit() {}
501 // CHECK-FIXES-NEXT: {{^ }}double m_array[1]{};
502 };
503
504 class ArrayBraceInitWithValue {
ArrayBraceInitWithValue()505 ArrayBraceInitWithValue() : m_array{3.14} {}
506 double m_array[1];
507 // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use default member initializer for 'm_array' [modernize-use-default-member-init]
508 // CHECK-FIXES: {{^ }}ArrayBraceInitWithValue() {}
509 // CHECK-FIXES-NEXT: {{^ }}double m_array[1]{3.14};
510 };
511
512 class ArrayBraceInitMultipleValues {
ArrayBraceInitMultipleValues()513 ArrayBraceInitMultipleValues() : m_array{1.0, 2.0, 3.0} {}
514 double m_array[3];
515 // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use default member initializer for 'm_array' [modernize-use-default-member-init]
516 // CHECK-FIXES: {{^ }}ArrayBraceInitMultipleValues() {}
517 // CHECK-FIXES-NEXT: {{^ }}double m_array[3]{1.0, 2.0, 3.0};
518 };
519
520 } // namespace PR63285
521