189a1d03eSRichard // RUN: %check_clang_tidy %s modernize-use-default-member-init %t -- \
2*e8a3ddafSNathan James // RUN: -config="{CheckOptions: {modernize-use-default-member-init.UseAssignment: true}}"
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 = '\0';
1389a1d03eSRichard   wchar_t c1;
1489a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: use default member initializer for 'c1'
1589a1d03eSRichard   // CHECK-FIXES: wchar_t c1 = L'\0';
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 = u'\0';
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 = U'\0';
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 = 0;
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 PositiveUnaryMinusInt {
PositiveUnaryMinusIntPositiveUnaryMinusInt4989a1d03eSRichard   PositiveUnaryMinusInt() : j(-1) {}
5089a1d03eSRichard   // CHECK-FIXES: PositiveUnaryMinusInt()  {}
5189a1d03eSRichard   int j;
5289a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'j'
5389a1d03eSRichard   // CHECK-FIXES: int j = -1;
5489a1d03eSRichard };
5589a1d03eSRichard 
5689a1d03eSRichard struct PositiveUnaryPlusInt {
PositiveUnaryPlusIntPositiveUnaryPlusInt5789a1d03eSRichard   PositiveUnaryPlusInt() : j(+1) {}
5889a1d03eSRichard   // CHECK-FIXES: PositiveUnaryPlusInt()  {}
5989a1d03eSRichard   int j;
6089a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use default member initializer for 'j'
6189a1d03eSRichard   // CHECK-FIXES: int j = +1;
6289a1d03eSRichard };
6389a1d03eSRichard 
6489a1d03eSRichard struct PositiveValueComplexInt {
PositiveValueComplexIntPositiveValueComplexInt6589a1d03eSRichard   PositiveValueComplexInt() : i() {}
6689a1d03eSRichard   // CHECK-FIXES: PositiveValueComplexInt()  {}
6789a1d03eSRichard   _Complex int i;
6889a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: use default member initializer for 'i'
6989a1d03eSRichard   // CHECK-FIXES: _Complex int i = 0;
7089a1d03eSRichard };
7189a1d03eSRichard 
7289a1d03eSRichard struct PositiveValueFloat {
PositiveValueFloatPositiveValueFloat7389a1d03eSRichard   PositiveValueFloat() : f() {}
7489a1d03eSRichard   // CHECK-FIXES: PositiveValueFloat()  {}
7589a1d03eSRichard   float f;
7689a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: use default member initializer for 'f'
7789a1d03eSRichard   // CHECK-FIXES: float f = 0.0f;
7889a1d03eSRichard };
7989a1d03eSRichard 
8089a1d03eSRichard struct PositiveValueDouble {
PositiveValueDoublePositiveValueDouble8189a1d03eSRichard   PositiveValueDouble() : d() {}
8289a1d03eSRichard   // CHECK-FIXES: PositiveValueDouble()  {}
8389a1d03eSRichard   double d;
8489a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use default member initializer for 'd'
8589a1d03eSRichard   // CHECK-FIXES: double d = 0.0;
8689a1d03eSRichard };
8789a1d03eSRichard 
8889a1d03eSRichard struct PositiveDouble {
PositiveDoublePositiveDouble8989a1d03eSRichard   PositiveDouble() : f(2.5463e43) {}
9089a1d03eSRichard   // CHECK-FIXES: PositiveDouble()  {}
9189a1d03eSRichard   double f;
9289a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use default member initializer for 'f'
9389a1d03eSRichard   // CHECK-FIXES: double f = 2.5463e43;
9489a1d03eSRichard };
9589a1d03eSRichard 
9689a1d03eSRichard struct PositiveValueComplexFloat {
PositiveValueComplexFloatPositiveValueComplexFloat9789a1d03eSRichard   PositiveValueComplexFloat() : f() {}
9889a1d03eSRichard   // CHECK-FIXES: PositiveValueComplexFloat()  {}
9989a1d03eSRichard   _Complex float f;
10089a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: use default member initializer for 'f'
10189a1d03eSRichard   // CHECK-FIXES: _Complex float f = 0.0f;
10289a1d03eSRichard };
10389a1d03eSRichard 
10489a1d03eSRichard struct PositiveValueComplexDouble {
PositiveValueComplexDoublePositiveValueComplexDouble10589a1d03eSRichard   PositiveValueComplexDouble() : f() {}
10689a1d03eSRichard   // CHECK-FIXES: PositiveValueComplexDouble()  {}
10789a1d03eSRichard   _Complex double f;
10889a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: use default member initializer for 'f'
10989a1d03eSRichard   // CHECK-FIXES: _Complex double f = 0.0;
11089a1d03eSRichard };
11189a1d03eSRichard 
11289a1d03eSRichard struct PositiveUnaryMinusDouble {
PositiveUnaryMinusDoublePositiveUnaryMinusDouble11389a1d03eSRichard   PositiveUnaryMinusDouble() : f(-2.5463e43) {}
11489a1d03eSRichard   // CHECK-FIXES: PositiveUnaryMinusDouble()  {}
11589a1d03eSRichard   double f;
11689a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use default member initializer for 'f'
11789a1d03eSRichard   // CHECK-FIXES: double f = -2.5463e43;
11889a1d03eSRichard };
11989a1d03eSRichard 
12089a1d03eSRichard struct PositiveUnaryPlusDouble {
PositiveUnaryPlusDoublePositiveUnaryPlusDouble12189a1d03eSRichard   PositiveUnaryPlusDouble() : f(+2.5463e43) {}
12289a1d03eSRichard   // CHECK-FIXES: PositiveUnaryPlusDouble()  {}
12389a1d03eSRichard   double f;
12489a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use default member initializer for 'f'
12589a1d03eSRichard   // CHECK-FIXES: double f = +2.5463e43;
12689a1d03eSRichard };
12789a1d03eSRichard 
12889a1d03eSRichard struct PositiveValueBool {
PositiveValueBoolPositiveValueBool12989a1d03eSRichard   PositiveValueBool() : b() {}
13089a1d03eSRichard   // CHECK-FIXES: PositiveValueBool()  {}
13189a1d03eSRichard   bool b;
13289a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use default member initializer for 'b'
13389a1d03eSRichard   // CHECK-FIXES: bool b = false;
13489a1d03eSRichard };
13589a1d03eSRichard 
13689a1d03eSRichard struct PositiveBool {
PositiveBoolPositiveBool13789a1d03eSRichard   PositiveBool() : a(true) {}
13889a1d03eSRichard   // CHECK-FIXES: PositiveBool()  {}
13989a1d03eSRichard   bool a;
14089a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use default member initializer for 'a'
14189a1d03eSRichard   // CHECK-FIXES: bool a = true;
14289a1d03eSRichard };
14389a1d03eSRichard 
14489a1d03eSRichard struct PositiveValuePointer {
PositiveValuePointerPositiveValuePointer14589a1d03eSRichard   PositiveValuePointer() : p() {}
14689a1d03eSRichard   // CHECK-FIXES: PositiveValuePointer()  {}
14789a1d03eSRichard   int *p;
14889a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use default member initializer for 'p'
14989a1d03eSRichard   // CHECK-FIXES: int *p = nullptr;
15089a1d03eSRichard };
15189a1d03eSRichard 
15289a1d03eSRichard struct PositiveNullPointer {
PositiveNullPointerPositiveNullPointer15389a1d03eSRichard   PositiveNullPointer() : q(nullptr) {}
15489a1d03eSRichard   // CHECK-FIXES: PositiveNullPointer()  {}
15589a1d03eSRichard   int *q;
15689a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use default member initializer for 'q'
15789a1d03eSRichard   // CHECK-FIXES: int *q = nullptr;
15889a1d03eSRichard };
15989a1d03eSRichard 
16089a1d03eSRichard enum Enum { Foo };
16189a1d03eSRichard struct PositiveEnum {
PositiveEnumPositiveEnum16289a1d03eSRichard   PositiveEnum() : e(Foo) {}
16389a1d03eSRichard   // CHECK-FIXES: PositiveEnum()  {}
16489a1d03eSRichard   Enum e;
16589a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use default member initializer for 'e'
16689a1d03eSRichard   // CHECK-FIXES: Enum e = Foo;
16789a1d03eSRichard };
16889a1d03eSRichard 
16989a1d03eSRichard struct PositiveValueEnum {
PositiveValueEnumPositiveValueEnum17089a1d03eSRichard   PositiveValueEnum() : e() {}
17189a1d03eSRichard   // CHECK-FIXES: PositiveValueEnum()  {}
17289a1d03eSRichard   Enum e;
17389a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use default member initializer for 'e'
17489a1d03eSRichard   // CHECK-FIXES: Enum e{};
17589a1d03eSRichard };
17689a1d03eSRichard 
17789a1d03eSRichard struct PositiveString {
PositiveStringPositiveString17889a1d03eSRichard   PositiveString() : s("foo") {}
17989a1d03eSRichard   // CHECK-FIXES: PositiveString()  {}
18089a1d03eSRichard   const char *s;
18189a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: use default member initializer for 's'
18289a1d03eSRichard   // CHECK-FIXES: const char *s = "foo";
18389a1d03eSRichard };
18489a1d03eSRichard 
18589a1d03eSRichard template <typename T>
18689a1d03eSRichard struct NegativeTemplate {
NegativeTemplateNegativeTemplate18789a1d03eSRichard     NegativeTemplate() : t() {}
18889a1d03eSRichard     T t;
18989a1d03eSRichard };
19089a1d03eSRichard 
19189a1d03eSRichard NegativeTemplate<int> nti;
19289a1d03eSRichard NegativeTemplate<double> ntd;
193311091e2SAMS21 
194311091e2SAMS21 namespace PR63285 {
195311091e2SAMS21 
196311091e2SAMS21 class ArrayValueInit {
ArrayValueInit()197311091e2SAMS21   ArrayValueInit() : m_array() {}
198311091e2SAMS21   double m_array[1];
199311091e2SAMS21   // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use default member initializer for 'm_array' [modernize-use-default-member-init]
200311091e2SAMS21   // CHECK-FIXES:      {{^  }}ArrayValueInit()  {}
201311091e2SAMS21   // CHECK-FIXES-NEXT: {{^  }}double m_array[1] = {};
202311091e2SAMS21 };
203311091e2SAMS21 
204311091e2SAMS21 class ArrayBraceInit {
ArrayBraceInit()205311091e2SAMS21   ArrayBraceInit() : m_array{} {}
206311091e2SAMS21   double m_array[1];
207311091e2SAMS21   // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use default member initializer for 'm_array' [modernize-use-default-member-init]
208311091e2SAMS21   // CHECK-FIXES:      {{^  }}ArrayBraceInit()  {}
209311091e2SAMS21   // CHECK-FIXES-NEXT: {{^  }}double m_array[1] = {};
210311091e2SAMS21 };
211311091e2SAMS21 
212311091e2SAMS21 class ArrayBraceInitWithValue {
ArrayBraceInitWithValue()213311091e2SAMS21   ArrayBraceInitWithValue() : m_array{3.14} {}
214311091e2SAMS21   double m_array[1];
215311091e2SAMS21   // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use default member initializer for 'm_array' [modernize-use-default-member-init]
216311091e2SAMS21   // CHECK-FIXES:      {{^  }}ArrayBraceInitWithValue()  {}
217311091e2SAMS21   // CHECK-FIXES-NEXT: {{^  }}double m_array[1] = {3.14};
218311091e2SAMS21 };
219311091e2SAMS21 
220311091e2SAMS21 class ArrayBraceInitMultipleValues {
ArrayBraceInitMultipleValues()221311091e2SAMS21   ArrayBraceInitMultipleValues() : m_array{1.0, 2.0, 3.0} {}
222311091e2SAMS21   double m_array[3];
223311091e2SAMS21   // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use default member initializer for 'm_array' [modernize-use-default-member-init]
224311091e2SAMS21   // CHECK-FIXES:      {{^  }}ArrayBraceInitMultipleValues()  {}
225311091e2SAMS21   // CHECK-FIXES-NEXT: {{^  }}double m_array[3] = {1.0, 2.0, 3.0};
226311091e2SAMS21 };
227311091e2SAMS21 
228311091e2SAMS21 } // namespace PR63285
229