xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/modernize/use-default-member-init.cpp (revision 311091e2b007ebe0da9877953a9a56a51102e60d)
189a1d03eSRichard // RUN: %check_clang_tidy -std=c++11,c++14,c++17 %s modernize-use-default-member-init %t -- -- -fexceptions
289a1d03eSRichard // FIXME: Fix the checker to work in C++20 mode.
389a1d03eSRichard 
489a1d03eSRichard struct S {
589a1d03eSRichard };
689a1d03eSRichard 
789a1d03eSRichard struct PositiveValueChar {
PositiveValueCharPositiveValueChar889a1d03eSRichard   PositiveValueChar() : c0(), c1()/*, c2(), c3()*/ {}
989a1d03eSRichard   // CHECK-FIXES: PositiveValueChar()  {}
1089a1d03eSRichard   const char c0;
1189a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: use default member initializer for 'c0' [modernize-use-default-member-init]
1289a1d03eSRichard   // CHECK-FIXES: const char c0{};
1389a1d03eSRichard   wchar_t c1;
1489a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: use default member initializer for 'c1'
1589a1d03eSRichard   // CHECK-FIXES: wchar_t c1{};
1689a1d03eSRichard   // FIXME: char16_t c2;
1789a1d03eSRichard   // C HECK-MESSAGES: :[[@LINE-1]]:12: warning: use default member initializer for 'c2'
1889a1d03eSRichard   // C HECK-FIXES: char16_t c2{};
1989a1d03eSRichard   // FIXME: char32_t c3;
2089a1d03eSRichard   // C HECK-MESSAGES: :[[@LINE-1]]:12: warning: use default member initializer for 'c3'
2189a1d03eSRichard   // C HECK-FIXES: char32_t c3{};
2289a1d03eSRichard };
2389a1d03eSRichard 
2489a1d03eSRichard struct PositiveChar {
PositiveCharPositiveChar2589a1d03eSRichard   PositiveChar() : d('a') {}
2689a1d03eSRichard   // CHECK-FIXES: PositiveChar()  {}
2789a1d03eSRichard   char d;
2889a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use default member initializer for 'd'
2989a1d03eSRichard   // CHECK-FIXES: char d{'a'};
3089a1d03eSRichard };
3189a1d03eSRichard 
3289a1d03eSRichard struct PositiveValueInt {
PositiveValueIntPositiveValueInt3389a1d03eSRichard   PositiveValueInt() : i() {}
3489a1d03eSRichard   // CHECK-FIXES: PositiveValueInt()  {}
3589a1d03eSRichard   const int i;
3689a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use default member initializer for 'i'
3789a1d03eSRichard   // CHECK-FIXES: const int i{};
3889a1d03eSRichard };
3989a1d03eSRichard 
4089a1d03eSRichard struct PositiveInt {
PositiveIntPositiveInt4189a1d03eSRichard   PositiveInt() : j(1) {}
4289a1d03eSRichard   // CHECK-FIXES: PositiveInt()  {}
4389a1d03eSRichard   int j;
4489a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'j'
4589a1d03eSRichard   // CHECK-FIXES: int j{1};
4689a1d03eSRichard };
4789a1d03eSRichard 
4889a1d03eSRichard struct PositiveNotDefaultInt {
PositiveNotDefaultIntPositiveNotDefaultInt4989a1d03eSRichard   PositiveNotDefaultInt(int) : i(7) {}
5089a1d03eSRichard   // CHECK-FIXES: PositiveNotDefaultInt(int)  {}
5189a1d03eSRichard   int i;
5289a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'i'
5389a1d03eSRichard   // CHECK-FIXES: int i{7};
5489a1d03eSRichard };
5589a1d03eSRichard 
5689a1d03eSRichard // We cannot reconcile these initializers.
5789a1d03eSRichard struct TwoConstructors {
TwoConstructorsTwoConstructors5889a1d03eSRichard     TwoConstructors(int) : i(7) {}
TwoConstructorsTwoConstructors5989a1d03eSRichard     TwoConstructors(int, int) : i(8) {}
6089a1d03eSRichard     int i;
6189a1d03eSRichard };
6289a1d03eSRichard 
63fa491fefSMarcoFalke struct TwoConstructorsTpl {
TwoConstructorsTplTwoConstructorsTpl64fa491fefSMarcoFalke   TwoConstructorsTpl() : i{7} {}
TwoConstructorsTplTwoConstructorsTpl65fa491fefSMarcoFalke   template <typename T> TwoConstructorsTpl(T, int) : i(8) {}
66fa491fefSMarcoFalke   int i;
67fa491fefSMarcoFalke };
68fa491fefSMarcoFalke 
6989a1d03eSRichard struct PositiveNotDefaultOOLInt {
7089a1d03eSRichard   PositiveNotDefaultOOLInt(int);
7189a1d03eSRichard   int i;
7289a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'i'
7389a1d03eSRichard   // CHECK-FIXES: int i{7};
7489a1d03eSRichard };
7589a1d03eSRichard 
PositiveNotDefaultOOLInt(int)7689a1d03eSRichard PositiveNotDefaultOOLInt::PositiveNotDefaultOOLInt(int) : i(7) {}
7789a1d03eSRichard // CHECK-FIXES: PositiveNotDefaultOOLInt::PositiveNotDefaultOOLInt(int)  {}
7889a1d03eSRichard 
7989a1d03eSRichard struct PositiveNotDefaultOOLInt2 {
8089a1d03eSRichard   PositiveNotDefaultOOLInt2(int, int);
8189a1d03eSRichard   int i;
8289a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'i'
8389a1d03eSRichard   // CHECK-FIXES: int i{7};
8489a1d03eSRichard   int j;
8589a1d03eSRichard };
8689a1d03eSRichard 
PositiveNotDefaultOOLInt2(int,int arg)8789a1d03eSRichard PositiveNotDefaultOOLInt2::PositiveNotDefaultOOLInt2(int, int arg) : i(7), j(arg) {}
8889a1d03eSRichard // CHECK-FIXES: PositiveNotDefaultOOLInt2::PositiveNotDefaultOOLInt2(int, int arg) :  j(arg) {}
8989a1d03eSRichard 
9089a1d03eSRichard struct PositiveUnaryMinusInt {
PositiveUnaryMinusIntPositiveUnaryMinusInt9189a1d03eSRichard   PositiveUnaryMinusInt() : j(-1) {}
9289a1d03eSRichard   // CHECK-FIXES: PositiveUnaryMinusInt()  {}
9389a1d03eSRichard   int j;
9489a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'j'
9589a1d03eSRichard   // CHECK-FIXES: int j{-1};
9689a1d03eSRichard };
9789a1d03eSRichard 
9889a1d03eSRichard struct PositiveUnaryPlusInt {
PositiveUnaryPlusIntPositiveUnaryPlusInt9989a1d03eSRichard   PositiveUnaryPlusInt() : j(+1) {}
10089a1d03eSRichard   // CHECK-FIXES: PositiveUnaryPlusInt()  {}
10189a1d03eSRichard   int j;
10289a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'j'
10389a1d03eSRichard   // CHECK-FIXES: int j{+1};
10489a1d03eSRichard };
10589a1d03eSRichard 
10689a1d03eSRichard struct PositiveValueComplexInt {
PositiveValueComplexIntPositiveValueComplexInt10789a1d03eSRichard   PositiveValueComplexInt() : i() {}
10889a1d03eSRichard   // CHECK-FIXES: PositiveValueComplexInt()  {}
10989a1d03eSRichard   _Complex int i;
11089a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: use default member initializer for 'i'
11189a1d03eSRichard   // CHECK-FIXES: _Complex int i{};
11289a1d03eSRichard };
11389a1d03eSRichard 
11489a1d03eSRichard struct PositiveValueFloat {
PositiveValueFloatPositiveValueFloat11589a1d03eSRichard   PositiveValueFloat() : f() {}
11689a1d03eSRichard   // CHECK-FIXES: PositiveValueFloat()  {}
11789a1d03eSRichard   float f;
11889a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: use default member initializer for 'f'
11989a1d03eSRichard   // CHECK-FIXES: float f{};
12089a1d03eSRichard };
12189a1d03eSRichard 
12289a1d03eSRichard struct PositiveValueDouble {
PositiveValueDoublePositiveValueDouble12389a1d03eSRichard   PositiveValueDouble() : d() {}
12489a1d03eSRichard   // CHECK-FIXES: PositiveValueDouble()  {}
12589a1d03eSRichard   double d;
12689a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use default member initializer for 'd'
12789a1d03eSRichard   // CHECK-FIXES: double d{};
12889a1d03eSRichard };
12989a1d03eSRichard 
13089a1d03eSRichard struct PositiveDouble {
PositiveDoublePositiveDouble13189a1d03eSRichard   PositiveDouble() : f(2.5463e43) {}
13289a1d03eSRichard   // CHECK-FIXES: PositiveDouble()  {}
13389a1d03eSRichard   double f;
13489a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use default member initializer for 'f'
13589a1d03eSRichard   // CHECK-FIXES: double f{2.5463e43};
13689a1d03eSRichard };
13789a1d03eSRichard 
13889a1d03eSRichard struct PositiveValueComplexFloat {
PositiveValueComplexFloatPositiveValueComplexFloat13989a1d03eSRichard   PositiveValueComplexFloat() : f() {}
14089a1d03eSRichard   // CHECK-FIXES: PositiveValueComplexFloat()  {}
14189a1d03eSRichard   _Complex float f;
14289a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: use default member initializer for 'f'
14389a1d03eSRichard   // CHECK-FIXES: _Complex float f{};
14489a1d03eSRichard };
14589a1d03eSRichard 
14689a1d03eSRichard struct PositiveValueComplexDouble {
PositiveValueComplexDoublePositiveValueComplexDouble14789a1d03eSRichard   PositiveValueComplexDouble() : f() {}
14889a1d03eSRichard   // CHECK-FIXES: PositiveValueComplexDouble()  {}
14989a1d03eSRichard   _Complex double f;
15089a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: use default member initializer for 'f'
15189a1d03eSRichard   // CHECK-FIXES: _Complex double f{};
15289a1d03eSRichard };
15389a1d03eSRichard 
15489a1d03eSRichard struct PositiveUnaryMinusDouble {
PositiveUnaryMinusDoublePositiveUnaryMinusDouble15589a1d03eSRichard   PositiveUnaryMinusDouble() : f(-2.5463e43) {}
15689a1d03eSRichard   // CHECK-FIXES: PositiveUnaryMinusDouble()  {}
15789a1d03eSRichard   double f;
15889a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use default member initializer for 'f'
15989a1d03eSRichard   // CHECK-FIXES: double f{-2.5463e43};
16089a1d03eSRichard };
16189a1d03eSRichard 
16289a1d03eSRichard struct PositiveUnaryPlusDouble {
PositiveUnaryPlusDoublePositiveUnaryPlusDouble16389a1d03eSRichard   PositiveUnaryPlusDouble() : f(+2.5463e43) {}
16489a1d03eSRichard   // CHECK-FIXES: PositiveUnaryPlusDouble()  {}
16589a1d03eSRichard   double f;
16689a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use default member initializer for 'f'
16789a1d03eSRichard   // CHECK-FIXES: double f{+2.5463e43};
16889a1d03eSRichard };
16989a1d03eSRichard 
17089a1d03eSRichard struct PositiveValueBool {
PositiveValueBoolPositiveValueBool17189a1d03eSRichard   PositiveValueBool() : b() {}
17289a1d03eSRichard   // CHECK-FIXES: PositiveValueBool()  {}
17389a1d03eSRichard   bool b;
17489a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use default member initializer for 'b'
17589a1d03eSRichard   // CHECK-FIXES: bool b{};
17689a1d03eSRichard };
17789a1d03eSRichard 
17889a1d03eSRichard struct PositiveBool {
PositiveBoolPositiveBool17989a1d03eSRichard   PositiveBool() : a(true) {}
18089a1d03eSRichard   // CHECK-FIXES: PositiveBool()  {}
18189a1d03eSRichard   bool a;
18289a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use default member initializer for 'a'
18389a1d03eSRichard   // CHECK-FIXES: bool a{true};
18489a1d03eSRichard };
18589a1d03eSRichard 
18689a1d03eSRichard struct PositiveValuePointer {
PositiveValuePointerPositiveValuePointer18789a1d03eSRichard   PositiveValuePointer() : p() {}
18889a1d03eSRichard   // CHECK-FIXES: PositiveValuePointer()  {}
18989a1d03eSRichard   int *p;
19089a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use default member initializer for 'p'
19189a1d03eSRichard   // CHECK-FIXES: int *p{};
19289a1d03eSRichard };
19389a1d03eSRichard 
19489a1d03eSRichard struct PositiveNullPointer {
PositiveNullPointerPositiveNullPointer19589a1d03eSRichard   PositiveNullPointer() : q(nullptr) {}
19689a1d03eSRichard   // CHECK-FIXES: PositiveNullPointer()  {}
19789a1d03eSRichard   int *q;
19889a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use default member initializer for 'q'
19989a1d03eSRichard   // CHECK-FIXES: int *q{nullptr};
20089a1d03eSRichard };
20189a1d03eSRichard 
20289a1d03eSRichard enum Enum { Foo, Bar };
20389a1d03eSRichard struct PositiveEnum {
PositiveEnumPositiveEnum20489a1d03eSRichard   PositiveEnum() : e(Foo) {}
20589a1d03eSRichard   // CHECK-FIXES: PositiveEnum()  {}
20689a1d03eSRichard   Enum e;
20789a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use default member initializer for 'e'
20889a1d03eSRichard   // CHECK-FIXES: Enum e{Foo};
20989a1d03eSRichard };
21089a1d03eSRichard 
21189a1d03eSRichard struct PositiveValueEnum {
PositiveValueEnumPositiveValueEnum21289a1d03eSRichard   PositiveValueEnum() : e() {}
21389a1d03eSRichard   // CHECK-FIXES: PositiveValueEnum()  {}
21489a1d03eSRichard   Enum e;
21589a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use default member initializer for 'e'
21689a1d03eSRichard   // CHECK-FIXES: Enum e{};
21789a1d03eSRichard };
21889a1d03eSRichard 
21989a1d03eSRichard struct PositiveString {
PositiveStringPositiveString22089a1d03eSRichard   PositiveString() : s("foo") {}
22189a1d03eSRichard   // CHECK-FIXES: PositiveString()  {}
22289a1d03eSRichard   const char *s;
22389a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: use default member initializer for 's'
22489a1d03eSRichard   // CHECK-FIXES: const char *s{"foo"};
22589a1d03eSRichard };
22689a1d03eSRichard 
22789a1d03eSRichard struct PositiveStruct {
PositiveStructPositiveStruct22889a1d03eSRichard   PositiveStruct() : s(7) {}
22989a1d03eSRichard   // CHECK-FIXES: PositiveStruct()  {}
23089a1d03eSRichard   struct {
23189a1d03eSRichard     int s;
23289a1d03eSRichard     // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: use default member initializer for 's'
23389a1d03eSRichard     // CHECK-FIXES: int s{7};
23489a1d03eSRichard   };
23589a1d03eSRichard };
23689a1d03eSRichard 
23789a1d03eSRichard template <typename T>
23889a1d03eSRichard struct NegativeTemplate {
NegativeTemplateNegativeTemplate23989a1d03eSRichard     NegativeTemplate() : t() {}
24089a1d03eSRichard     T t;
24189a1d03eSRichard };
24289a1d03eSRichard 
24389a1d03eSRichard NegativeTemplate<int> nti;
24489a1d03eSRichard NegativeTemplate<double> ntd;
24589a1d03eSRichard 
24689a1d03eSRichard struct NegativeDefaultMember {
NegativeDefaultMemberNegativeDefaultMember24789a1d03eSRichard   NegativeDefaultMember() {}
24889a1d03eSRichard   int i = 2;
24989a1d03eSRichard };
25089a1d03eSRichard 
25189a1d03eSRichard struct NegativeClass : S {
NegativeClassNegativeClass25289a1d03eSRichard   NegativeClass() : s() {}
25389a1d03eSRichard   S s;
25489a1d03eSRichard };
25589a1d03eSRichard 
25689a1d03eSRichard struct NegativeBase : S {
NegativeBaseNegativeBase25789a1d03eSRichard   NegativeBase() : S() {}
25889a1d03eSRichard };
25989a1d03eSRichard 
26089a1d03eSRichard struct NegativeDefaultOtherMember{
NegativeDefaultOtherMemberNegativeDefaultOtherMember26189a1d03eSRichard   NegativeDefaultOtherMember() : i(3) {}
26289a1d03eSRichard   int i = 4;
26389a1d03eSRichard };
26489a1d03eSRichard 
26589a1d03eSRichard struct NegativeUnion {
NegativeUnionNegativeUnion26689a1d03eSRichard   NegativeUnion() : d(5.0) {}
26789a1d03eSRichard   union {
26889a1d03eSRichard     int i;
26989a1d03eSRichard     double d;
27089a1d03eSRichard   };
27189a1d03eSRichard };
27289a1d03eSRichard 
27389a1d03eSRichard struct NegativeBitField
27489a1d03eSRichard {
NegativeBitFieldNegativeBitField27589a1d03eSRichard   NegativeBitField() : i(6) {}
27689a1d03eSRichard   int i : 5;
27789a1d03eSRichard };
27889a1d03eSRichard 
27989a1d03eSRichard struct NegativeDefaultArg
28089a1d03eSRichard {
NegativeDefaultArgNegativeDefaultArg28189a1d03eSRichard   NegativeDefaultArg(int i = 4) : i(i) {}
28289a1d03eSRichard   int i;
28389a1d03eSRichard };
28489a1d03eSRichard 
28589a1d03eSRichard struct ExistingChar {
ExistingCharExistingChar28689a1d03eSRichard   ExistingChar(short) : e1(), e2{}, e3(), e4() {}
28789a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: member initializer for 'e1' is redundant [modernize-use-default-member-init]
28889a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-2]]:31: warning: member initializer for 'e2' is redundant
28989a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-3]]:37: warning: member initializer for 'e3' is redundant
29089a1d03eSRichard   // CHECK-FIXES: ExistingChar(short) :  e4() {}
ExistingCharExistingChar29189a1d03eSRichard   ExistingChar(int) : e1(0), e2{0}, e3(0), e4(0) {}
29289a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: member initializer for 'e1' is redundant
29389a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-2]]:30: warning: member initializer for 'e2' is redundant
29489a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-3]]:37: warning: member initializer for 'e3' is redundant
29589a1d03eSRichard   // CHECK-FIXES: ExistingChar(int) :  e4(0) {}
ExistingCharExistingChar29689a1d03eSRichard   ExistingChar(long) : e1('\0'), e2{'\0'}, e3('\0'), e4('\0') {}
29789a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: member initializer for 'e1' is redundant
29889a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-2]]:34: warning: member initializer for 'e2' is redundant
29989a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-3]]:44: warning: member initializer for 'e3' is redundant
30089a1d03eSRichard   // CHECK-FIXES: ExistingChar(long) :  e4('\0') {}
ExistingCharExistingChar30189a1d03eSRichard   ExistingChar(char) : e1('a'), e2{'a'}, e3('a'), e4('a') {}
30289a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:51: warning: member initializer for 'e4' is redundant
30389a1d03eSRichard   // CHECK-FIXES: ExistingChar(char) : e1('a'), e2{'a'}, e3('a') {}
30489a1d03eSRichard   char e1{};
30589a1d03eSRichard   char e2 = 0;
30689a1d03eSRichard   char e3 = '\0';
30789a1d03eSRichard   char e4 = 'a';
30889a1d03eSRichard };
30989a1d03eSRichard 
31089a1d03eSRichard struct ExistingInt {
ExistingIntExistingInt31189a1d03eSRichard   ExistingInt(short) : e1(), e2{}, e3(), e4(), e5(), e6() {}
31289a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: member initializer for 'e1' is redundant [modernize-use-default-member-init]
31389a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-2]]:30: warning: member initializer for 'e2' is redundant
31489a1d03eSRichard   // CHECK-FIXES: ExistingInt(short) :  e3(), e4(), e5(), e6() {}
ExistingIntExistingInt31589a1d03eSRichard   ExistingInt(int) : e1(0), e2{0}, e3(0), e4(0), e5(0), e6(0) {}
31689a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: member initializer for 'e1' is redundant
31789a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-2]]:29: warning: member initializer for 'e2' is redundant
31889a1d03eSRichard   // CHECK-FIXES: ExistingInt(int) :  e3(0), e4(0), e5(0), e6(0) {}
ExistingIntExistingInt31989a1d03eSRichard   ExistingInt(long) : e1(5), e2{5}, e3(5), e4(5), e5(5), e6(5) {}
32089a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:37: warning: member initializer for 'e3' is redundant
32189a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-2]]:44: warning: member initializer for 'e4' is redundant
32289a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-3]]:58: warning: member initializer for 'e6' is redundant
32389a1d03eSRichard   // CHECK-FIXES: ExistingInt(long) : e1(5), e2{5},  e5(5) {}
ExistingIntExistingInt32489a1d03eSRichard   ExistingInt(char) : e1(-5), e2{-5}, e3(-5), e4(-5), e5(-5), e6(-5) {}
32589a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:55: warning: member initializer for 'e5' is redundant
32689a1d03eSRichard   // CHECK-FIXES: ExistingInt(char) : e1(-5), e2{-5}, e3(-5), e4(-5),  e6(-5) {}
32789a1d03eSRichard   int e1{};
32889a1d03eSRichard   int e2 = 0;
32989a1d03eSRichard   int e3 = {5};
33089a1d03eSRichard   int e4{5};
33189a1d03eSRichard   int e5 = -5;
33289a1d03eSRichard   int e6 = +5;
33389a1d03eSRichard };
33489a1d03eSRichard 
33589a1d03eSRichard struct ExistingDouble {
ExistingDoubleExistingDouble33689a1d03eSRichard   ExistingDouble(short) : e1(), e2{}, e3(), e4(), e5() {}
33789a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: member initializer for 'e1' is redundant
33889a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-2]]:33: warning: member initializer for 'e2' is redundant
33989a1d03eSRichard   // CHECK-FIXES: ExistingDouble(short) :  e3(), e4(), e5() {}
ExistingDoubleExistingDouble34089a1d03eSRichard   ExistingDouble(int) : e1(0.0), e2{0.0}, e3(0.0), e4(0.0), e5(0.0) {}
34189a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: member initializer for 'e1' is redundant
34289a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-2]]:34: warning: member initializer for 'e2' is redundant
34389a1d03eSRichard   // CHECK-FIXES: ExistingDouble(int) :  e3(0.0), e4(0.0), e5(0.0) {}
ExistingDoubleExistingDouble34489a1d03eSRichard   ExistingDouble(long) : e1(5.0), e2{5.0}, e3(5.0), e4(5.0), e5(5.0) {}
34589a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:44: warning: member initializer for 'e3' is redundant
34689a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-2]]:62: warning: member initializer for 'e5' is redundant
34789a1d03eSRichard   // CHECK-FIXES: ExistingDouble(long) : e1(5.0), e2{5.0},  e4(5.0) {}
ExistingDoubleExistingDouble34889a1d03eSRichard   ExistingDouble(char) : e1(-5.0), e2{-5.0}, e3(-5.0), e4(-5.0), e5(-5.0) {}
34989a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:56: warning: member initializer for 'e4' is redundant
35089a1d03eSRichard   // CHECK-FIXES: ExistingDouble(char) : e1(-5.0), e2{-5.0}, e3(-5.0),  e5(-5.0) {}
35189a1d03eSRichard   double e1{};
35289a1d03eSRichard   double e2 = 0.0;
35389a1d03eSRichard   double e3 = 5.0;
35489a1d03eSRichard   double e4{-5.0};
35589a1d03eSRichard   double e5 = +5.0;
35689a1d03eSRichard };
35789a1d03eSRichard 
35889a1d03eSRichard struct ExistingBool {
ExistingBoolExistingBool35989a1d03eSRichard   ExistingBool(short) : e1(), e2{}, e3() {}
36089a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: member initializer for 'e1' is redundant
36189a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-2]]:31: warning: member initializer for 'e2' is redundant
36289a1d03eSRichard   // CHECK-FIXES: ExistingBool(short) :  e3() {}
ExistingBoolExistingBool36389a1d03eSRichard   ExistingBool(int) : e1(false), e2{false}, e3(false) {}
36489a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: member initializer for 'e1' is redundant
36589a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-2]]:34: warning: member initializer for 'e2' is redundant
36689a1d03eSRichard   // CHECK-FIXES: ExistingBool(int) :  e3(false) {}
ExistingBoolExistingBool36789a1d03eSRichard   ExistingBool(long) : e1(true), e2{true}, e3(true) {}
36889a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:44: warning: member initializer for 'e3' is redundant
36989a1d03eSRichard   // CHECK-FIXES: ExistingBool(long) : e1(true), e2{true} {}
37089a1d03eSRichard   bool e1{};
37189a1d03eSRichard   bool e2 = false;
37289a1d03eSRichard   bool e3{true};
37389a1d03eSRichard };
37489a1d03eSRichard 
37589a1d03eSRichard struct ExistingEnum {
ExistingEnumExistingEnum37689a1d03eSRichard   ExistingEnum(short) : e1(Foo), e2{Foo} {}
37789a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: member initializer for 'e1' is redundant
37889a1d03eSRichard   // CHECK-FIXES: ExistingEnum(short) :  e2{Foo} {}
ExistingEnumExistingEnum37989a1d03eSRichard   ExistingEnum(int) : e1(Bar), e2{Bar} {}
38089a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: member initializer for 'e2' is redundant
38189a1d03eSRichard   // CHECK-FIXES: ExistingEnum(int) : e1(Bar) {}
38289a1d03eSRichard   Enum e1 = Foo;
38389a1d03eSRichard   Enum e2{Bar};
38489a1d03eSRichard };
38589a1d03eSRichard 
38689a1d03eSRichard struct ExistingPointer {
ExistingPointerExistingPointer38789a1d03eSRichard   ExistingPointer(short) : e1(), e2{}, e3(), e4() {}
38889a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: member initializer for 'e1' is redundant
38989a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-2]]:34: warning: member initializer for 'e2' is redundant
39089a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-3]]:40: warning: member initializer for 'e3' is redundant
39189a1d03eSRichard   // CHECK-FIXES: ExistingPointer(short) :  e4() {}
ExistingPointerExistingPointer39289a1d03eSRichard   ExistingPointer(int) : e1(0), e2{0}, e3(0), e4(&e1) {}
39389a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: member initializer for 'e1' is redundant
39489a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-2]]:33: warning: member initializer for 'e2' is redundant
39589a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-3]]:40: warning: member initializer for 'e3' is redundant
39689a1d03eSRichard   // CHECK-FIXES: ExistingPointer(int) :  e4(&e1) {}
ExistingPointerExistingPointer39789a1d03eSRichard   ExistingPointer(long) : e1(nullptr), e2{nullptr}, e3(nullptr), e4(&e2) {}
39889a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: member initializer for 'e1' is redundant
39989a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-2]]:40: warning: member initializer for 'e2' is redundant
40089a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-3]]:53: warning: member initializer for 'e3' is redundant
40189a1d03eSRichard   // CHECK-FIXES: ExistingPointer(long) :  e4(&e2) {}
40289a1d03eSRichard   int *e1{};
40389a1d03eSRichard   int *e2 = 0;
40489a1d03eSRichard   int *e3{nullptr};
40589a1d03eSRichard   int **e4 = &e1;
40689a1d03eSRichard };
40789a1d03eSRichard 
40889a1d03eSRichard struct ExistingString {
ExistingStringExistingString40989a1d03eSRichard   ExistingString(short) : e1(), e2{}, e3(), e4() {}
41089a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: member initializer for 'e1' is redundant [modernize-use-default-member-init]
41189a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-2]]:33: warning: member initializer for 'e2' is redundant
41289a1d03eSRichard   // CHECK-FIXES: ExistingString(short) :  e3(), e4() {}
ExistingStringExistingString41389a1d03eSRichard   ExistingString(int) : e1(0), e2{0}, e3(0), e4(0) {}
41489a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: member initializer for 'e1' is redundant
41589a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-2]]:32: warning: member initializer for 'e2' is redundant
41689a1d03eSRichard   // CHECK-FIXES: ExistingString(int) :  e3(0), e4(0) {}
ExistingStringExistingString41789a1d03eSRichard   ExistingString(long) : e1(nullptr), e2{nullptr}, e3(nullptr), e4(nullptr) {}
41889a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: member initializer for 'e1' is redundant
41989a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-2]]:39: warning: member initializer for 'e2' is redundant
42089a1d03eSRichard   // CHECK-FIXES: ExistingString(long) :  e3(nullptr), e4(nullptr) {}
ExistingStringExistingString42189a1d03eSRichard   ExistingString(char) : e1("foo"), e2{"foo"}, e3("foo"), e4("foo") {}
42289a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:48: warning: member initializer for 'e3' is redundant
42389a1d03eSRichard   // CHECK-FIXES: ExistingString(char) : e1("foo"), e2{"foo"},  e4("foo") {}
42489a1d03eSRichard   const char *e1{};
42589a1d03eSRichard   const char *e2 = nullptr;
42689a1d03eSRichard   const char *e3 = "foo";
42789a1d03eSRichard   const char *e4 = "bar";
42889a1d03eSRichard };
42989a1d03eSRichard 
43089a1d03eSRichard struct UnionExisting {
UnionExistingUnionExisting43189a1d03eSRichard   UnionExisting() : e(5.0) {}
43289a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: member initializer for 'e' is redundant
43389a1d03eSRichard   // CHECK-FIXES: UnionExisting()  {}
43489a1d03eSRichard   union {
43589a1d03eSRichard     int i;
43689a1d03eSRichard     double e = 5.0;
43789a1d03eSRichard   };
43889a1d03eSRichard };
43989a1d03eSRichard 
44089a1d03eSRichard template <typename T>
44189a1d03eSRichard struct NegativeTemplateExisting {
NegativeTemplateExistingNegativeTemplateExisting44289a1d03eSRichard   NegativeTemplateExisting(int) : t(0) {}
44389a1d03eSRichard   T t{};
44489a1d03eSRichard };
44589a1d03eSRichard 
44689a1d03eSRichard NegativeTemplateExisting<int> ntei(0);
44789a1d03eSRichard NegativeTemplateExisting<double> nted(0);
44889a1d03eSRichard 
44989a1d03eSRichard // This resulted in a warning by default.
45089a1d03eSRichard #define MACRO() \
45189a1d03eSRichard   struct MacroS { \
45289a1d03eSRichard     void *P; \
45389a1d03eSRichard     MacroS() : P(nullptr) {} \
45489a1d03eSRichard   };
45589a1d03eSRichard 
45689a1d03eSRichard MACRO();
45789a1d03eSRichard 
45889a1d03eSRichard 
45989a1d03eSRichard class FunctionTryBlock {
46089a1d03eSRichard public:
FunctionTryBlock()46189a1d03eSRichard   FunctionTryBlock() try : i(5), k(8) {}
46289a1d03eSRichard   // CHECK-FIXES: FunctionTryBlock() try  {}
46389a1d03eSRichard   catch (...) {}
46489a1d03eSRichard 
46589a1d03eSRichard private:
46689a1d03eSRichard   int i, k;
46789a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'i' [modernize-use-default-member-init]
46889a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-2]]:10: warning: use default member initializer for 'k' [modernize-use-default-member-init]
46989a1d03eSRichard   // CHECK-FIXES: int i{5}, k{8};
47089a1d03eSRichard };
47189a1d03eSRichard 
47289a1d03eSRichard struct PR45363 {
47389a1d03eSRichard   // Ensure no warning is emitted here
PR45363PR4536347489a1d03eSRichard   PR45363(int i = 0) : m_i{i} {}
47589a1d03eSRichard   int m_i;
47689a1d03eSRichard };
47789a1d03eSRichard 
47889a1d03eSRichard struct EmptyBracedIntDefault {
EmptyBracedIntDefaultEmptyBracedIntDefault47989a1d03eSRichard   EmptyBracedIntDefault() : m_i{} {}
48089a1d03eSRichard   int m_i;
48189a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'm_i' [modernize-use-default-member-init]
48289a1d03eSRichard   // CHECK-FIXES:      {{^  }}EmptyBracedIntDefault()  {}
48389a1d03eSRichard   // CHECK-FIXES-NEXT: {{^  }}int m_i{};
48489a1d03eSRichard };
485*311091e2SAMS21 
486*311091e2SAMS21 namespace PR63285 {
487*311091e2SAMS21 
488*311091e2SAMS21 class ArrayValueInit {
ArrayValueInit()489*311091e2SAMS21   ArrayValueInit() : m_array() {}
490*311091e2SAMS21   double m_array[1];
491*311091e2SAMS21   // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use default member initializer for 'm_array' [modernize-use-default-member-init]
492*311091e2SAMS21   // CHECK-FIXES:      {{^  }}ArrayValueInit()  {}
493*311091e2SAMS21   // CHECK-FIXES-NEXT: {{^  }}double m_array[1]{};
494*311091e2SAMS21 };
495*311091e2SAMS21 
496*311091e2SAMS21 class ArrayBraceInit {
ArrayBraceInit()497*311091e2SAMS21   ArrayBraceInit() : m_array{} {}
498*311091e2SAMS21   double m_array[1];
499*311091e2SAMS21   // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use default member initializer for 'm_array' [modernize-use-default-member-init]
500*311091e2SAMS21   // CHECK-FIXES:      {{^  }}ArrayBraceInit()  {}
501*311091e2SAMS21   // CHECK-FIXES-NEXT: {{^  }}double m_array[1]{};
502*311091e2SAMS21 };
503*311091e2SAMS21 
504*311091e2SAMS21 class ArrayBraceInitWithValue {
ArrayBraceInitWithValue()505*311091e2SAMS21   ArrayBraceInitWithValue() : m_array{3.14} {}
506*311091e2SAMS21   double m_array[1];
507*311091e2SAMS21   // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use default member initializer for 'm_array' [modernize-use-default-member-init]
508*311091e2SAMS21   // CHECK-FIXES:      {{^  }}ArrayBraceInitWithValue()  {}
509*311091e2SAMS21   // CHECK-FIXES-NEXT: {{^  }}double m_array[1]{3.14};
510*311091e2SAMS21 };
511*311091e2SAMS21 
512*311091e2SAMS21 class ArrayBraceInitMultipleValues {
ArrayBraceInitMultipleValues()513*311091e2SAMS21   ArrayBraceInitMultipleValues() : m_array{1.0, 2.0, 3.0} {}
514*311091e2SAMS21   double m_array[3];
515*311091e2SAMS21   // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use default member initializer for 'm_array' [modernize-use-default-member-init]
516*311091e2SAMS21   // CHECK-FIXES:      {{^  }}ArrayBraceInitMultipleValues()  {}
517*311091e2SAMS21   // CHECK-FIXES-NEXT: {{^  }}double m_array[3]{1.0, 2.0, 3.0};
518*311091e2SAMS21 };
519*311091e2SAMS21 
520*311091e2SAMS21 } // namespace PR63285
521