xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/modernize/use-default-member-init.cpp (revision 311091e2b007ebe0da9877953a9a56a51102e60d)
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