1 // RUN: %check_clang_tidy -std=c++98 %s cppcoreguidelines-pro-type-member-init %t -- -- -fno-delayed-template-parsing
2 
3 struct PositiveFieldBeforeConstructor {
4   int F;
PositiveFieldBeforeConstructorPositiveFieldBeforeConstructor5   PositiveFieldBeforeConstructor() /* some comment */ {}
6   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: constructor does not initialize these fields: F
7   // CHECK-FIXES: PositiveFieldBeforeConstructor() : F() /* some comment */ {}
8 };
9 
10 struct PositiveFieldAfterConstructor {
PositiveFieldAfterConstructorPositiveFieldAfterConstructor11   PositiveFieldAfterConstructor() {}
12   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: constructor does not initialize these fields: F, G, H
13   // CHECK-FIXES: PositiveFieldAfterConstructor() : F(), G(), H() {}
14   int F;
15   bool G /* with comment */;
16   int *H;
17   PositiveFieldBeforeConstructor IgnoredField;
18 };
19 
20 struct PositiveSeparateDefinition {
21   PositiveSeparateDefinition();
22   int F;
23 };
24 
PositiveSeparateDefinition()25 PositiveSeparateDefinition::PositiveSeparateDefinition() {}
26 // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: constructor does not initialize these fields: F
27 // CHECK-FIXES: PositiveSeparateDefinition::PositiveSeparateDefinition() : F() {}
28 
29 struct PositiveMixedFieldOrder {
PositiveMixedFieldOrderPositiveMixedFieldOrder30   PositiveMixedFieldOrder() : /* some comment */ J(0), L(0), M(0) {}
31   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: constructor does not initialize these fields: I, K, N
32   // CHECK-FIXES: PositiveMixedFieldOrder() : I(), /* some comment */ J(0), K(), L(0), M(0), N() {}
33   int I;
34   int J;
35   int K;
36   int L;
37   int M;
38   int N;
39 };
40 
41 struct PositiveAfterBaseInitializer : public PositiveMixedFieldOrder {
PositiveAfterBaseInitializerPositiveAfterBaseInitializer42   PositiveAfterBaseInitializer() : PositiveMixedFieldOrder() {}
43   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: constructor does not initialize these fields: F
44   // CHECK-FIXES: PositiveAfterBaseInitializer() : PositiveMixedFieldOrder(), F() {}
45   int F;
46 };
47 
48 struct NegativeFieldInitialized {
49   int F;
50 
NegativeFieldInitializedNegativeFieldInitialized51   NegativeFieldInitialized() : F() {}
52 };
53 
54 struct NegativeFieldInitializedInDefinition {
55   int F;
56 
57   NegativeFieldInitializedInDefinition();
58 };
59 
NegativeFieldInitializedInDefinition()60 NegativeFieldInitializedInDefinition::NegativeFieldInitializedInDefinition() : F() {}
61 
62 struct NegativeInitializedInBody {
NegativeInitializedInBodyNegativeInitializedInBody63   NegativeInitializedInBody() { I = 0; }
64   int I;
65 };
66 
67 struct NegativeAggregateType {
68   int X;
69   int Y;
70   int Z;
71 };
72 
73 struct TrivialType {
74   int X;
75   int Y;
76 };
77 
78 struct PositiveUninitializedBaseOrdering : public NegativeAggregateType,
79                                            public TrivialType {
PositiveUninitializedBaseOrderingPositiveUninitializedBaseOrdering80   PositiveUninitializedBaseOrdering() : NegativeAggregateType(), TrivialType(), B() {}
81   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: constructor does not initialize these fields: A
82   // CHECK-FIXES: PositiveUninitializedBaseOrdering() : NegativeAggregateType(), TrivialType(), A(), B() {}
83 
84   // This is somewhat pathological with the base class initializer at the end...
PositiveUninitializedBaseOrderingPositiveUninitializedBaseOrdering85   PositiveUninitializedBaseOrdering(int) : B(), TrivialType(), A() {}
86   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: constructor does not initialize these bases: NegativeAggregateType
87   // CHECK-FIXES: PositiveUninitializedBaseOrdering(int) : B(), NegativeAggregateType(), TrivialType(), A() {}
88 
PositiveUninitializedBaseOrderingPositiveUninitializedBaseOrdering89   PositiveUninitializedBaseOrdering(float) : NegativeAggregateType(), A() {}
90   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: constructor does not initialize these bases: TrivialType
91   // CHECK-MESSAGES: :[[@LINE-2]]:3: warning: constructor does not initialize these fields: B
92   // CHECK-FIXES: PositiveUninitializedBaseOrdering(float) : NegativeAggregateType(), TrivialType(), A(), B() {}
93 
94   int A, B;
95 };
96 
97 template <class T>
98 class PositiveTemplateBase : T {
99 public:
PositiveTemplateBase()100   PositiveTemplateBase() {}
101   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: constructor does not initialize these fields: X
102   // CHECK-FIXES: PositiveTemplateBase() : X() {}
103 
104   int X;
105 };
106 
107 class PositiveIndirectMember {
108   struct {
109     int *A;
110   };
111 
PositiveIndirectMember()112   PositiveIndirectMember() : A() {}
PositiveIndirectMember(int)113   PositiveIndirectMember(int) {}
114   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: constructor does not initialize these fields: A
115   // CHECK-FIXES: PositiveIndirectMember(int) : A() {}
116 };
117