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