1 // RUN: %clang_cc1 -fsyntax-only -Wall -Wuninitialized -Wno-unused-value -Wno-unused-lambda-capture -Wno-uninitialized-const-reference -std=c++1z -verify %s
3 // definitions for std::move
6 template <class T
> struct remove_reference
{ typedef T type
; };
7 template <class T
> struct remove_reference
<T
&> { typedef T type
; };
8 template <class T
> struct remove_reference
<T
&&> { typedef T type
; };
10 template <class T
> typename remove_reference
<T
>::type
&& move(T
&& t
);
17 int far(const int& x
);
21 // Test self-references within initializers which are guaranteed to be
23 int a
= a
; // no-warning: used to signal intended lack of initialization.
24 int b
= b
+ 1; // expected-warning {{variable 'b' is uninitialized when used within its own initialization}}
25 int c
= (c
+ c
); // expected-warning 2 {{variable 'c' is uninitialized when used within its own initialization}}
26 int e
= static_cast<long>(e
) + 1; // expected-warning {{variable 'e' is uninitialized when used within its own initialization}}
27 int f
= foo(f
); // expected-warning {{variable 'f' is uninitialized when used within its own initialization}}
29 // These don't warn as they don't require the value.
35 int k
= __alignof__(k
);
37 int l
= k
? l
: l
; // expected-warning 2{{variable 'l' is uninitialized when used within its own initialization}}
38 int m
= 1 + (k
? m
: m
); // expected-warning 2{{variable 'm' is uninitialized when used within its own initialization}}
39 int n
= -n
; // expected-warning {{variable 'n' is uninitialized when used within its own initialization}}
40 int o
= std::move(o
); // expected-warning {{variable 'o' is uninitialized when used within its own initialization}}
41 const int p
= std::move(p
); // expected-warning {{variable 'p' is uninitialized when used within its own initialization}}
42 int q
= moved(std::move(q
)); // expected-warning {{variable 'q' is uninitialized when used within its own initialization}}
43 int r
= std::move((p
? q
: (18, r
))); // expected-warning {{variable 'r' is uninitialized when used within its own initialization}}
44 int s
= r
?: s
; // expected-warning {{variable 's' is uninitialized when used within its own initialization}}
45 int t
= t
?: s
; // expected-warning {{variable 't' is uninitialized when used within its own initialization}}
46 int u
= (foo(u
), s
); // expected-warning {{variable 'u' is uninitialized when used within its own initialization}}
47 int v
= (u
+= v
); // expected-warning {{variable 'v' is uninitialized when used within its own initialization}}
48 int w
= (w
+= 10); // expected-warning {{variable 'w' is uninitialized when used within its own initialization}}
49 int x
= x
++; // expected-warning {{variable 'x' is uninitialized when used within its own initialization}}
50 int y
= ((s
? (y
, v
) : (77, y
))++, sizeof(y
)); // expected-warning {{variable 'y' is uninitialized when used within its own initialization}}
51 int z
= ++ref(z
); // expected-warning {{variable 'z' is uninitialized when used within its own initialization}}
52 int aa
= (ref(aa
) += 10); // expected-warning {{variable 'aa' is uninitialized when used within its own initialization}}
53 int bb
= bb
? x
: y
; // expected-warning {{variable 'bb' is uninitialized when used within its own initialization}}
56 int a
= a
; // no-warning: used to signal intended lack of initialization.
57 int b
= b
+ 1; // expected-warning {{variable 'b' is uninitialized when used within its own initialization}}
58 int c
= (c
+ c
); // expected-warning {{variable 'c' is uninitialized when used within its own initialization}}
59 int d
= ({ d
+ d
;}); // expected-warning {{variable 'd' is uninitialized when used within its own initialization}}
60 int e
= static_cast<long>(e
) + 1; // expected-warning {{variable 'e' is uninitialized when used within its own initialization}}
61 int f
= foo(f
); // expected-warning {{variable 'f' is uninitialized when used within its own initialization}}
63 // These don't warn as they don't require the value.
69 int k
= __alignof__(k
);
71 int l
= k
? l
: l
; // expected-warning {{variable 'l' is uninitialized when used within its own initialization}}
72 int m
= 1 + (k
? m
: m
); // expected-warning {{'m' is uninitialized when used within its own initialization}}
73 int n
= -n
; // expected-warning {{variable 'n' is uninitialized when used within its own initialization}}
74 int o
= std::move(o
); // expected-warning {{variable 'o' is uninitialized when used within its own initialization}}
75 const int p
= std::move(p
); // expected-warning {{variable 'p' is uninitialized when used within its own initialization}}
76 int q
= moved(std::move(q
)); // expected-warning {{variable 'q' is uninitialized when used within its own initialization}}
77 int r
= std::move((p
? q
: (18, r
))); // expected-warning {{variable 'r' is uninitialized when used within its own initialization}}
78 int s
= r
?: s
; // expected-warning {{variable 's' is uninitialized when used within its own initialization}}
79 int t
= t
?: s
; // expected-warning {{variable 't' is uninitialized when used within its own initialization}}
80 int u
= (foo(u
), s
); // expected-warning {{variable 'u' is uninitialized when used within its own initialization}}
81 int v
= (u
+= v
); // expected-warning {{variable 'v' is uninitialized when used within its own initialization}}
82 int w
= (w
+= 10); // expected-warning {{variable 'w' is uninitialized when used within its own initialization}}
83 int x
= x
++; // expected-warning {{variable 'x' is uninitialized when used within its own initialization}}
84 int y
= ((s
? (y
, v
) : (77, y
))++, sizeof(y
)); // expected-warning {{variable 'y' is uninitialized when used within its own initialization}}
85 int z
= ++ref(z
); // expected-warning {{variable 'z' is uninitialized when used within its own initialization}}
86 int aa
= (ref(aa
) += 10); // expected-warning {{variable 'aa' is uninitialized when used within its own initialization}}
87 int bb
= bb
? x
: y
; // expected-warning {{variable 'bb' is uninitialized when used within its own initialization}}
90 int a
= a
; // no-warning: used to signal intended lack of initialization.
91 int b
= b
+ 1; // expected-warning {{variable 'b' is uninitialized when used within its own initialization}}
92 int c
= (c
+ c
); // expected-warning {{variable 'c' is uninitialized when used within its own initialization}}
93 int d
= ({ d
+ d
;}); // expected-warning {{variable 'd' is uninitialized when used within its own initialization}}
94 int e
= static_cast<long>(e
) + 1; // expected-warning {{variable 'e' is uninitialized when used within its own initialization}}
95 int f
= foo(f
); // expected-warning {{variable 'f' is uninitialized when used within its own initialization}}
97 // These don't warn as they don't require the value.
103 int k
= __alignof__(k
);
105 int l
= k
? l
: l
; // expected-warning {{variable 'l' is uninitialized when used within its own initialization}}
106 int m
= 1 + (k
? m
: m
); // expected-warning {{'m' is uninitialized when used within its own initialization}}
107 int n
= -n
; // expected-warning {{variable 'n' is uninitialized when used within its own initialization}}
108 int o
= std::move(o
); // expected-warning {{variable 'o' is uninitialized when used within its own initialization}}
109 const int p
= std::move(p
); // expected-warning {{variable 'p' is uninitialized when used within its own initialization}}
110 int q
= moved(std::move(q
)); // expected-warning {{variable 'q' is uninitialized when used within its own initialization}}
111 int r
= std::move((p
? q
: (18, r
))); // expected-warning {{variable 'r' is uninitialized when used within its own initialization}}
112 int s
= r
?: s
; // expected-warning {{variable 's' is uninitialized when used within its own initialization}}
113 int t
= t
?: s
; // expected-warning {{variable 't' is uninitialized when used within its own initialization}}
114 int u
= (foo(u
), s
); // expected-warning {{variable 'u' is uninitialized when used within its own initialization}}
115 int v
= (u
+= v
); // expected-warning {{variable 'v' is uninitialized when used within its own initialization}}
116 int w
= (w
+= 10); // expected-warning {{variable 'w' is uninitialized when used within its own initialization}}
117 int x
= x
++; // expected-warning {{variable 'x' is uninitialized when used within its own initialization}}
118 int y
= ((s
? (y
, v
) : (77, y
))++, sizeof(y
)); // expected-warning {{variable 'y' is uninitialized when used within its own initialization}}
119 int z
= ++ref(z
); // expected-warning {{variable 'z' is uninitialized when used within its own initialization}}
120 int aa
= (ref(aa
) += 10); // expected-warning {{variable 'aa' is uninitialized when used within its own initialization}}
121 int bb
= bb
? x
: y
; // expected-warning {{variable 'bb' is uninitialized when used within its own initialization}}
127 int a
; // expected-note {{initialize the variable 'a' to silence this warning}}
128 int b
= (a
, a
?: 2); // expected-warning {{variable 'a' is uninitialized when used here}}
129 int c
= (a
, a
, b
, c
); // expected-warning {{variable 'c' is uninitialized when used within its own initialization}}
130 int d
; // expected-note {{initialize the variable 'd' to silence this warning}}
131 int e
= (foo(d
), e
, b
); // expected-warning {{variable 'd' is uninitialized when used here}}
132 int f
; // expected-note {{initialize the variable 'f' to silence this warning}}
133 f
= f
+ 1, 2; // expected-warning {{variable 'f' is uninitialized when used here}}
135 int g
= (h
, g
, 2); // no-warning: h, g are evaluated but not used.
138 namespace member_ptr
{
145 void test_member_ptr() {
147 A a
{a
.*px
}; // expected-warning {{variable 'a' is uninitialized when used within its own initialization}}
148 A b
= b
; // expected-warning {{variable 'b' is uninitialized when used within its own initialization}}
152 namespace const_ptr
{
154 void bar(const int *a
);
155 void foobar(const int **a
);
157 void test_const_ptr() {
159 int b
; // expected-note {{initialize the variable 'b' to silence this warning}}
162 b
= a
+ b
; // expected-warning {{variable 'b' is uninitialized when used here}}
163 int *ptr
; //expected-note {{initialize the variable 'ptr' to silence this warning}}
165 foo(ptr
); // expected-warning {{variable 'ptr' is uninitialized when used here}}
170 // Also test similar constructs in a field's initializer.
177 S(bool (*)[1]) : x(x
) {} // expected-warning {{field 'x' is uninitialized when used here}}
178 S(bool (*)[2]) : x(x
+ 1) {} // expected-warning {{field 'x' is uninitialized when used here}}
179 S(bool (*)[3]) : x(x
+ x
) {} // expected-warning 2{{field 'x' is uninitialized when used here}}
180 S(bool (*)[4]) : x(static_cast<long>(x
) + 1) {} // expected-warning {{field 'x' is uninitialized when used here}}
181 S(bool (*)[5]) : x(foo(x
)) {} // expected-warning {{field 'x' is uninitialized when used here}}
183 // These don't actually require the value of x and so shouldn't warn.
184 S(char (*)[1]) : x(sizeof(x
)) {}
185 S(char (*)[2]) : ptr(&ptr
) {}
186 S(char (*)[3]) : x(bar(&x
)) {}
187 S(char (*)[4]) : x(boo(x
)) {}
188 S(char (*)[5]) : x(far(x
)) {}
189 S(char (*)[6]) : x(__alignof__(x
)) {}
191 S(int (*)[1]) : x(0), y(x
? y
: y
) {} // expected-warning 2{{field 'y' is uninitialized when used here}}
192 S(int (*)[2]) : x(0), y(1 + (x
? y
: y
)) {} // expected-warning 2{{field 'y' is uninitialized when used here}}
193 S(int (*)[3]) : x(-x
) {} // expected-warning {{field 'x' is uninitialized when used here}}
194 S(int (*)[4]) : x(std::move(x
)) {} // expected-warning {{field 'x' is uninitialized when used here}}
195 S(int (*)[5]) : z(std::move(z
)) {} // expected-warning {{field 'z' is uninitialized when used here}}
196 S(int (*)[6]) : x(moved(std::move(x
))) {} // expected-warning {{field 'x' is uninitialized when used here}}
197 S(int (*)[7]) : x(0), y(std::move((x
? x
: (18, y
)))) {} // expected-warning {{field 'y' is uninitialized when used here}}
198 S(int (*)[8]) : x(0), y(x
?: y
) {} // expected-warning {{field 'y' is uninitialized when used here}}
199 S(int (*)[9]) : x(0), y(y
?: x
) {} // expected-warning {{field 'y' is uninitialized when used here}}
200 S(int (*)[10]) : x(0), y((foo(y
), x
)) {} // expected-warning {{field 'y' is uninitialized when used here}}
201 S(int (*)[11]) : x(0), y(x
+= y
) {} // expected-warning {{field 'y' is uninitialized when used here}}
202 S(int (*)[12]) : x(x
+= 10) {} // expected-warning {{field 'x' is uninitialized when used here}}
203 S(int (*)[13]) : x(x
++) {} // expected-warning {{field 'x' is uninitialized when used here}}
204 S(int (*)[14]) : x(0), y(((x
? (y
, x
) : (77, y
))++, sizeof(y
))) {} // expected-warning {{field 'y' is uninitialized when used here}}
205 S(int (*)[15]) : x(++ref(x
)) {} // expected-warning {{field 'x' is uninitialized when used here}}
206 S(int (*)[16]) : x((ref(x
) += 10)) {} // expected-warning {{field 'x' is uninitialized when used here}}
207 S(int (*)[17]) : x(0), y(y
? x
: x
) {} // expected-warning {{field 'y' is uninitialized when used here}}
210 // Test self-references with record types.
214 enum count
{ ONE
, TWO
, THREE
};
217 int get() const { return num
; }
218 int get2() { return num
; }
219 int set(int x
) { num
= x
; return num
; }
220 static int zero() { return 0; }
230 bool operator!=(const A
&);
233 bool operator!=(int, const A
&);
235 A
getA() { return A(); }
236 A
getA(int x
) { return A(); }
237 A
getA(A
* a
) { return A(); }
238 A
getA(A a
) { return A(); }
239 A
moveA(A
&& a
) { return A(); }
240 A
const_refA(const A
& a
) { return A(); }
242 void setupA(bool x
) {
255 A
a11(a11
); // expected-warning {{variable 'a11' is uninitialized when used within its own initialization}}
256 A
a12(a12
.get()); // expected-warning {{variable 'a12' is uninitialized when used within its own initialization}}
257 A
a13(a13
.num
); // expected-warning {{variable 'a13' is uninitialized when used within its own initialization}}
258 A a14
= A(a14
); // expected-warning {{variable 'a14' is uninitialized when used within its own initialization}}
259 A a15
= getA(a15
.num
); // expected-warning {{variable 'a15' is uninitialized when used within its own initialization}}
260 A
a16(&a16
.num
); // expected-warning {{variable 'a16' is uninitialized when used within its own initialization}}
261 A
a17(a17
.get2()); // expected-warning {{variable 'a17' is uninitialized when used within its own initialization}}
262 A a18
= x
? a18
: a17
; // expected-warning {{variable 'a18' is uninitialized when used within its own initialization}}
263 A a19
= getA(x
? a19
: a17
); // expected-warning {{variable 'a19' is uninitialized when used within its own initialization}}
264 A a20
{a20
}; // expected-warning {{variable 'a20' is uninitialized when used within its own initialization}}
265 A a21
= {a21
}; // expected-warning {{variable 'a21' is uninitialized when used within its own initialization}}
267 // FIXME: Make the local uninitialized warning consistent with the global
268 // uninitialized checking.
269 A
*a22
= new A(a22
->count
); // expected-warning {{variable 'a22' is uninitialized when used within its own initialization}}
270 A
*a23
= new A(a23
->ONE
); // expected-warning {{variable 'a23' is uninitialized when used within its own initialization}}
271 A
*a24
= new A(a24
->TWO
); // expected-warning {{variable 'a24' is uninitialized when used within its own initialization}}
272 A
*a25
= new A(a25
->zero()); // expected-warning {{variable 'a25' is uninitialized when used within its own initialization}}
274 A
*a26
= new A(a26
->get()); // expected-warning {{variable 'a26' is uninitialized when used within its own initialization}}
275 A
*a27
= new A(a27
->get2()); // expected-warning {{variable 'a27' is uninitialized when used within its own initialization}}
276 A
*a28
= new A(a28
->num
); // expected-warning {{variable 'a28' is uninitialized when used within its own initialization}}
278 const A
a29(a29
); // expected-warning {{variable 'a29' is uninitialized when used within its own initialization}}
279 const A a30
= a30
; // expected-warning {{variable 'a30' is uninitialized when used within its own initialization}}
281 A a31
= std::move(a31
); // expected-warning {{variable 'a31' is uninitialized when used within its own initialization}}
282 A a32
= moveA(std::move(a32
)); // expected-warning {{variable 'a32' is uninitialized when used within its own initialization}}
283 A a33
= A(std::move(a33
)); // expected-warning {{variable 'a33' is uninitialized when used within its own initialization}}
284 A
a34(std::move(a34
)); // expected-warning {{variable 'a34' is uninitialized when used within its own initialization}}
285 A a35
= std::move(x
? a34
: (37, a35
)); // expected-warning {{variable 'a35' is uninitialized when used within its own initialization}}
287 A a36
= const_refA(a36
);
288 A
a37(const_refA(a37
));
290 A
a38({a38
}); // expected-warning {{variable 'a38' is uninitialized when used within its own initialization}}
291 A a39
= {a39
}; // expected-warning {{variable 'a39' is uninitialized when used within its own initialization}}
292 A a40
= A({a40
}); // expected-warning {{variable 'a40' is uninitialized when used within its own initialization}}
294 A a41
= !a41
; // expected-warning {{variable 'a41' is uninitialized when used within its own initialization}}
295 A a42
= !(a42
); // expected-warning {{variable 'a42' is uninitialized when used within its own initialization}}
296 A a43
= a43
!= a42
; // expected-warning {{variable 'a43' is uninitialized when used within its own initialization}}
297 A a44
= a43
!= a44
; // expected-warning {{variable 'a44' is uninitialized when used within its own initialization}}
298 A a45
= a45
!= a45
; // expected-warning 2{{variable 'a45' is uninitialized when used within its own initialization}}
299 A a46
= 0 != a46
; // expected-warning {{variable 'a46' is uninitialized when used within its own initialization}}
301 A
a47(a47
.set(a47
.num
)); // expected-warning 2{{variable 'a47' is uninitialized when used within its own initialization}}
302 A
a48(a47
.set(a48
.num
)); // expected-warning {{variable 'a48' is uninitialized when used within its own initialization}}
303 A
a49(a47
.set(a48
.num
));
319 A
a11(a11
); // expected-warning {{variable 'a11' is uninitialized when used within its own initialization}}
320 A
a12(a12
.get()); // expected-warning {{variable 'a12' is uninitialized when used within its own initialization}}
321 A
a13(a13
.num
); // expected-warning {{variable 'a13' is uninitialized when used within its own initialization}}
322 A a14
= A(a14
); // expected-warning {{variable 'a14' is uninitialized when used within its own initialization}}
323 A a15
= getA(a15
.num
); // expected-warning {{variable 'a15' is uninitialized when used within its own initialization}}
324 A
a16(&a16
.num
); // expected-warning {{variable 'a16' is uninitialized when used within its own initialization}}
325 A
a17(a17
.get2()); // expected-warning {{variable 'a17' is uninitialized when used within its own initialization}}
326 A a18
= cond
? a18
: a17
; // expected-warning {{variable 'a18' is uninitialized when used within its own initialization}}
327 A a19
= getA(cond
? a19
: a17
); // expected-warning {{variable 'a19' is uninitialized when used within its own initialization}}
328 A a20
{a20
}; // expected-warning {{variable 'a20' is uninitialized when used within its own initialization}}
329 A a21
= {a21
}; // expected-warning {{variable 'a21' is uninitialized when used within its own initialization}}
331 A
*a22
= new A(a22
->count
);
332 A
*a23
= new A(a23
->ONE
);
333 A
*a24
= new A(a24
->TWO
);
334 A
*a25
= new A(a25
->zero());
336 A
*a26
= new A(a26
->get()); // expected-warning {{variable 'a26' is uninitialized when used within its own initialization}}
337 A
*a27
= new A(a27
->get2()); // expected-warning {{variable 'a27' is uninitialized when used within its own initialization}}
338 A
*a28
= new A(a28
->num
); // expected-warning {{variable 'a28' is uninitialized when used within its own initialization}}
340 const A
a29(a29
); // expected-warning {{variable 'a29' is uninitialized when used within its own initialization}}
341 const A a30
= a30
; // expected-warning {{variable 'a30' is uninitialized when used within its own initialization}}
343 A a31
= std::move(a31
); // expected-warning {{variable 'a31' is uninitialized when used within its own initialization}}
344 A a32
= moveA(std::move(a32
)); // expected-warning {{variable 'a32' is uninitialized when used within its own initialization}}
345 A a33
= A(std::move(a33
)); // expected-warning {{variable 'a33' is uninitialized when used within its own initialization}}
346 A
a34(std::move(a34
)); // expected-warning {{variable 'a34' is uninitialized when used within its own initialization}}
347 A a35
= std::move(x
? a34
: (37, a35
)); // expected-warning {{variable 'a35' is uninitialized when used within its own initialization}}
349 A a36
= const_refA(a36
);
350 A
a37(const_refA(a37
));
352 A
a38({a38
}); // expected-warning {{variable 'a38' is uninitialized when used within its own initialization}}
353 A a39
= {a39
}; // expected-warning {{variable 'a39' is uninitialized when used within its own initialization}}
354 A a40
= A({a40
}); // expected-warning {{variable 'a40' is uninitialized when used within its own initialization}}
356 A a41
= !a41
; // expected-warning {{variable 'a41' is uninitialized when used within its own initialization}}
357 A a42
= !(a42
); // expected-warning {{variable 'a42' is uninitialized when used within its own initialization}}
358 A a43
= a43
!= a42
; // expected-warning {{variable 'a43' is uninitialized when used within its own initialization}}
359 A a44
= a43
!= a44
; // expected-warning {{variable 'a44' is uninitialized when used within its own initialization}}
360 A a45
= a45
!= a45
; // expected-warning 2{{variable 'a45' is uninitialized when used within its own initialization}}
362 A a46
= 0 != a46
; // expected-warning {{variable 'a46' is uninitialized when used within its own initialization}}
364 A
a47(a47
.set(a47
.num
)); // expected-warning 2{{variable 'a47' is uninitialized when used within its own initialization}}
365 A
a48(a47
.set(a48
.num
)); // expected-warning {{variable 'a48' is uninitialized when used within its own initialization}}
366 A
a49(a47
.set(a48
.num
));
374 T(bool (*)[1]) : a() {}
375 T(bool (*)[2]) : a2(a
.get()) {}
376 T(bool (*)[3]) : a2(a
) {}
377 T(bool (*)[4]) : a(&a
) {}
378 T(bool (*)[5]) : a(a
.zero()) {}
379 T(bool (*)[6]) : a(a
.ONE
) {}
380 T(bool (*)[7]) : a(getA()) {}
381 T(bool (*)[8]) : a2(getA(a
.TWO
)) {}
382 T(bool (*)[9]) : a(getA(&a
)) {}
383 T(bool (*)[10]) : a(a
.count
) {}
385 T(bool (*)[11]) : a(a
) {} // expected-warning {{field 'a' is uninitialized when used here}}
386 T(bool (*)[12]) : a(a
.get()) {} // expected-warning {{field 'a' is uninitialized when used here}}
387 T(bool (*)[13]) : a(a
.num
) {} // expected-warning {{field 'a' is uninitialized when used here}}
388 T(bool (*)[14]) : a(A(a
)) {} // expected-warning {{field 'a' is uninitialized when used here}}
389 T(bool (*)[15]) : a(getA(a
.num
)) {} // expected-warning {{field 'a' is uninitialized when used here}}
390 T(bool (*)[16]) : a(&a
.num
) {} // expected-warning {{field 'a' is uninitialized when used here}}
391 T(bool (*)[17]) : a(a
.get2()) {} // expected-warning {{field 'a' is uninitialized when used here}}
392 T(bool (*)[18]) : a2(cond
? a2
: a
) {} // expected-warning {{field 'a2' is uninitialized when used here}}
393 T(bool (*)[19]) : a2(cond
? a2
: a
) {} // expected-warning {{field 'a2' is uninitialized when used here}}
394 T(bool (*)[20]) : a
{a
} {} // expected-warning {{field 'a' is uninitialized when used here}}
395 T(bool (*)[21]) : a({a
}) {} // expected-warning {{field 'a' is uninitialized when used here}}
397 T(bool (*)[22]) : ptr_a(new A(ptr_a
->count
)) {}
398 T(bool (*)[23]) : ptr_a(new A(ptr_a
->ONE
)) {}
399 T(bool (*)[24]) : ptr_a(new A(ptr_a
->TWO
)) {}
400 T(bool (*)[25]) : ptr_a(new A(ptr_a
->zero())) {}
402 T(bool (*)[26]) : ptr_a(new A(ptr_a
->get())) {} // expected-warning {{field 'ptr_a' is uninitialized when used here}}
403 T(bool (*)[27]) : ptr_a(new A(ptr_a
->get2())) {} // expected-warning {{field 'ptr_a' is uninitialized when used here}}
404 T(bool (*)[28]) : ptr_a(new A(ptr_a
->num
)) {} // expected-warning {{field 'ptr_a' is uninitialized when used here}}
406 T(bool (*)[29]) : c_a(c_a
) {} // expected-warning {{field 'c_a' is uninitialized when used here}}
407 T(bool (*)[30]) : c_a(A(c_a
)) {} // expected-warning {{field 'c_a' is uninitialized when used here}}
409 T(bool (*)[31]) : a(std::move(a
)) {} // expected-warning {{field 'a' is uninitialized when used here}}
410 T(bool (*)[32]) : a(moveA(std::move(a
))) {} // expected-warning {{field 'a' is uninitialized when used here}}
411 T(bool (*)[33]) : a(A(std::move(a
))) {} // expected-warning {{field 'a' is uninitialized when used here}}
412 T(bool (*)[34]) : a(A(std::move(a
))) {} // expected-warning {{field 'a' is uninitialized when used here}}
413 T(bool (*)[35]) : a2(std::move(x
? a
: (37, a2
))) {} // expected-warning {{field 'a2' is uninitialized when used here}}
415 T(bool (*)[36]) : a(const_refA(a
)) {}
416 T(bool (*)[37]) : a(A(const_refA(a
))) {}
418 T(bool (*)[38]) : a({a
}) {} // expected-warning {{field 'a' is uninitialized when used here}}
419 T(bool (*)[39]) : a
{a
} {} // expected-warning {{field 'a' is uninitialized when used here}}
420 T(bool (*)[40]) : a({a
}) {} // expected-warning {{field 'a' is uninitialized when used here}}
422 T(bool (*)[41]) : a(!a
) {} // expected-warning {{field 'a' is uninitialized when used here}}
423 T(bool (*)[42]) : a(!(a
)) {} // expected-warning {{field 'a' is uninitialized when used here}}
424 T(bool (*)[43]) : a(), a2(a2
!= a
) {} // expected-warning {{field 'a2' is uninitialized when used here}}
425 T(bool (*)[44]) : a(), a2(a
!= a2
) {} // expected-warning {{field 'a2' is uninitialized when used here}}
426 T(bool (*)[45]) : a(a
!= a
) {} // expected-warning 2{{field 'a' is uninitialized when used here}}
427 T(bool (*)[46]) : a(0 != a
) {} // expected-warning {{field 'a' is uninitialized when used here}}
429 T(bool (*)[47]) : a2(a2
.set(a2
.num
)) {} // expected-warning 2{{field 'a2' is uninitialized when used here}}
430 T(bool (*)[48]) : a2(a
.set(a2
.num
)) {} // expected-warning {{field 'a2' is uninitialized when used here}}
431 T(bool (*)[49]) : a2(a
.set(a
.num
)) {}
441 B
getB() { return B(); };
442 B
getB(int x
) { return B(); };
443 B
getB(int *x
) { return B(); };
444 B
getB(B
*b
) { return B(); };
445 B
moveB(B
&&b
) { return B(); };
447 B
* getPtrB() { return 0; };
448 B
* getPtrB(int x
) { return 0; };
449 B
* getPtrB(int *x
) { return 0; };
450 B
* getPtrB(B
**b
) { return 0; };
452 void setupB(bool x
) {
460 // Silence unused warning
464 B
b7(b7
); // expected-warning {{variable 'b7' is uninitialized when used within its own initialization}}
465 B b8
= getB(b8
.x
); // expected-warning {{variable 'b8' is uninitialized when used within its own initialization}}
466 B b9
= getB(b9
.y
); // expected-warning {{variable 'b9' is uninitialized when used within its own initialization}}
467 B b10
= getB(-b10
.x
); // expected-warning {{variable 'b10' is uninitialized when used within its own initialization}}
472 B
* b14
= getPtrB(&b14
);
477 B
* b15
= getPtrB(b15
->x
); // expected-warning {{variable 'b15' is uninitialized when used within its own initialization}}
478 B
* b16
= getPtrB(b16
->y
); // expected-warning {{variable 'b16' is uninitialized when used within its own initialization}}
480 B b17
= { b17
.x
= 5, b17
.y
= 0 };
481 B b18
= { b18
.x
+ 1, b18
.y
}; // expected-warning 2{{variable 'b18' is uninitialized when used within its own initialization}}
483 const B b19
= b19
; // expected-warning {{variable 'b19' is uninitialized when used within its own initialization}}
484 const B
b20(b20
); // expected-warning {{variable 'b20' is uninitialized when used within its own initialization}}
486 B b21
= std::move(b21
); // expected-warning {{variable 'b21' is uninitialized when used within its own initialization}}
487 B b22
= moveB(std::move(b22
)); // expected-warning {{variable 'b22' is uninitialized when used within its own initialization}}
488 B b23
= B(std::move(b23
)); // expected-warning {{variable 'b23' is uninitialized when used within its own initialization}}
489 B b24
= std::move(x
? b23
: (18, b24
)); // expected-warning {{variable 'b24' is uninitialized when used within its own initialization}}
499 B
b7(b7
); // expected-warning {{variable 'b7' is uninitialized when used within its own initialization}}
500 B b8
= getB(b8
.x
); // expected-warning {{variable 'b8' is uninitialized when used within its own initialization}}
501 B b9
= getB(b9
.y
); // expected-warning {{variable 'b9' is uninitialized when used within its own initialization}}
502 B b10
= getB(-b10
.x
); // expected-warning {{variable 'b10' is uninitialized when used within its own initialization}}
507 B
* b14
= getPtrB(&b14
);
509 B
* b15
= getPtrB(b15
->x
); // expected-warning {{variable 'b15' is uninitialized when used within its own initialization}}
510 B
* b16
= getPtrB(b16
->y
); // expected-warning {{variable 'b16' is uninitialized when used within its own initialization}}
512 B b17
= { b17
.x
= 5, b17
.y
= 0 };
513 B b18
= { b18
.x
+ 1, b18
.y
}; // expected-warning 2{{variable 'b18' is uninitialized when used within its own initialization}}
515 const B b19
= b19
; // expected-warning {{variable 'b19' is uninitialized when used within its own initialization}}
516 const B
b20(b20
); // expected-warning {{variable 'b20' is uninitialized when used within its own initialization}}
518 B b21
= std::move(b21
); // expected-warning {{variable 'b21' is uninitialized when used within its own initialization}}
519 B b22
= moveB(std::move(b22
)); // expected-warning {{variable 'b22' is uninitialized when used within its own initialization}}
520 B b23
= B(std::move(b23
)); // expected-warning {{variable 'b23' is uninitialized when used within its own initialization}}
521 B b24
= std::move(x
? b23
: (18, b24
)); // expected-warning {{variable 'b24' is uninitialized when used within its own initialization}}
529 U(bool (*)[1]) : b1() {}
530 U(bool (*)[2]) : b2(b1
) {}
531 U(bool (*)[3]) : b1
{ 5, &b1
.x
} {}
532 U(bool (*)[4]) : b1(getB()) {}
533 U(bool (*)[5]) : b1(getB(&b1
)) {}
534 U(bool (*)[6]) : b1(getB(&b1
.x
)) {}
536 U(bool (*)[7]) : b1(b1
) {} // expected-warning {{field 'b1' is uninitialized when used here}}
537 U(bool (*)[8]) : b1(getB(b1
.x
)) {} // expected-warning {{field 'b1' is uninitialized when used here}}
538 U(bool (*)[9]) : b1(getB(b1
.y
)) {} // expected-warning {{field 'b1' is uninitialized when used here}}
539 U(bool (*)[10]) : b1(getB(-b1
.x
)) {} // expected-warning {{field 'b1' is uninitialized when used here}}
541 U(bool (*)[11]) : ptr1(0) {}
542 U(bool (*)[12]) : ptr1(0), ptr2(ptr1
) {}
543 U(bool (*)[13]) : ptr1(getPtrB()) {}
544 U(bool (*)[14]) : ptr1(getPtrB(&ptr1
)) {}
546 U(bool (*)[15]) : ptr1(getPtrB(ptr1
->x
)) {} // expected-warning {{field 'ptr1' is uninitialized when used here}}
547 U(bool (*)[16]) : ptr2(getPtrB(ptr2
->y
)) {} // expected-warning {{field 'ptr2' is uninitialized when used here}}
549 U(bool (*)[17]) : b1
{ b1
.x
= 5, b1
.y
= 0 } {}
550 U(bool (*)[18]) : b1
{ b1
.x
+ 1, b1
.y
} {} // expected-warning 2{{field 'b1' is uninitialized when used here}}
552 U(bool (*)[19]) : constb(constb
) {} // expected-warning {{field 'constb' is uninitialized when used here}}
553 U(bool (*)[20]) : constb(B(constb
)) {} // expected-warning {{field 'constb' is uninitialized when used here}}
555 U(bool (*)[21]) : b1(std::move(b1
)) {} // expected-warning {{field 'b1' is uninitialized when used here}}
556 U(bool (*)[22]) : b1(moveB(std::move(b1
))) {} // expected-warning {{field 'b1' is uninitialized when used here}}
557 U(bool (*)[23]) : b1(B(std::move(b1
))) {} // expected-warning {{field 'b1' is uninitialized when used here}}
558 U(bool (*)[24]) : b2(std::move(x
? b1
: (18, b2
))) {} // expected-warning {{field 'b2' is uninitialized when used here}}
561 struct C
{ char a
[100], *e
; } car
= { .e
= car
.a
};
563 namespace rdar10398199
{
564 class FooBase
{ protected: ~FooBase() {} };
565 class Foo
: public FooBase
{
567 operator int&() const;
570 template <typename T
> class FooImpl
: public Foo
{
573 FooImpl(const T
&x
) : val(x
) {}
574 ~FooImpl() { stuff(); }
577 template <typename T
> FooImpl
<T
> makeFoo(const T
& x
) {
578 return FooImpl
<T
>(x
);
582 const Foo
&x
= makeFoo(42);
583 const int&y
= makeFoo(42u);
589 // PR 12325 - this was a false uninitialized value warning due to
591 int pr12325(int params
) {
603 // Test lambda expressions with -Wuninitialized
605 auto f1
= [] (int x
, int y
) { int z
; return x
+ y
+ z
; }; // expected-warning{{variable 'z' is uninitialized when used here}} expected-note {{initialize the variable 'z' to silence this warning}}
612 static int A2() {return 5;}
614 int A4() { return 5;}
629 // Accessing non-static members will give a warning.
632 D(char (*)[1]) : c(c
.b
.a
.A1
) {}
633 D(char (*)[2]) : c(c
.b
.a
.A2()) {}
634 D(char (*)[3]) : c(c
.b
.a
.A3
) {} // expected-warning {{field 'c' is uninitialized when used here}}
635 D(char (*)[4]) : c(c
.b
.a
.A4()) {} // expected-warning {{field 'c' is uninitialized when used here}}
637 // c::a is static, so it is already initialized
638 D(char (*)[5]) : c(c
.a
.A1
) {}
639 D(char (*)[6]) : c(c
.a
.A2()) {}
640 D(char (*)[7]) : c(c
.a
.A3
) {}
641 D(char (*)[8]) : c(c
.a
.A4()) {}
647 int a
; // This field needs to be last to prevent the cross field
648 // uninitialized warning.
649 E(char (*)[1]) : a(a
? b
: c
) {} // expected-warning {{field 'a' is uninitialized when used here}}
650 E(char (*)[2]) : a(b
? a
: a
) {} // expected-warning 2{{field 'a' is uninitialized when used here}}
651 E(char (*)[3]) : a(b
? (a
) : c
) {} // expected-warning {{field 'a' is uninitialized when used here}}
652 E(char (*)[4]) : a(b
? c
: (a
+c
)) {} // expected-warning {{field 'a' is uninitialized when used here}}
653 E(char (*)[5]) : a(b
? c
: b
) {}
655 E(char (*)[6]) : a(a
?: a
) {} // expected-warning 2{{field 'a' is uninitialized when used here}}
656 E(char (*)[7]) : a(b
?: a
) {} // expected-warning {{field 'a' is uninitialized when used here}}
657 E(char (*)[8]) : a(a
?: c
) {} // expected-warning {{field 'a' is uninitialized when used here}}
658 E(char (*)[9]) : a(b
?: c
) {}
660 E(char (*)[10]) : a((a
, a
, b
)) {}
661 E(char (*)[11]) : a((c
+ a
, a
+ 1, b
)) {} // expected-warning 2{{field 'a' is uninitialized when used here}}
662 E(char (*)[12]) : a((b
+ c
, c
, a
)) {} // expected-warning {{field 'a' is uninitialized when used here}}
663 E(char (*)[13]) : a((a
, a
, a
, a
)) {} // expected-warning {{field 'a' is uninitialized when used here}}
664 E(char (*)[14]) : a((b
, c
, c
)) {}
665 E(char (*)[15]) : a(b
?: a
) {} // expected-warning {{field 'a' is uninitialized when used here}}
666 E(char (*)[16]) : a(a
?: b
) {} // expected-warning {{field 'a' is uninitialized when used here}}
677 F
* F::*f_ptr
= &F::f
;
681 G(char (*)[1]) : f1(f1
) {} // expected-warning {{field 'f1' is uninitialized when used here}}
682 G(char (*)[2]) : f2(f1
) {}
683 G(char (*)[3]) : f2(F()) {}
685 G(char (*)[4]) : f1(f1
.*ptr
) {} // expected-warning {{field 'f1' is uninitialized when used here}}
686 G(char (*)[5]) : f2(f1
.*ptr
) {}
688 G(char (*)[6]) : f3(f3
) {} // expected-warning {{field 'f3' is uninitialized when used here}}
689 G(char (*)[7]) : f3(f3
->*f_ptr
) {} // expected-warning {{field 'f3' is uninitialized when used here}}
690 G(char (*)[8]) : f3(new F(f3
->*ptr
)) {} // expected-warning {{field 'f3' is uninitialized when used here}}
694 H() : a(a
) {} // expected-warning {{field 'a' is uninitialized when used here}}
700 static int a
= a
; // no-warning: used to signal intended lack of initialization.
701 static int b
= b
+ 1; // expected-warning {{variable 'b' is uninitialized when used within its own initialization}}
702 static int c
= (c
+ c
); // expected-warning 2{{variable 'c' is uninitialized when used within its own initialization}}
703 static int e
= static_cast<long>(e
) + 1; // expected-warning {{variable 'e' is uninitialized when used within its own initialization}}
704 static int f
= foo(f
); // expected-warning {{variable 'f' is uninitialized when used within its own initialization}}
706 // These don't warn as they don't require the value.
707 static int g
= sizeof(g
);
708 int gg
= g
; // Silence unneeded warning
709 static void* ptr
= &ptr
;
710 static int h
= bar(&h
);
711 static int i
= boo(i
);
712 static int j
= far(j
);
713 static int k
= __alignof__(k
);
715 static int l
= k
? l
: l
; // expected-warning 2{{variable 'l' is uninitialized when used within its own initialization}}
716 static int m
= 1 + (k
? m
: m
); // expected-warning 2{{variable 'm' is uninitialized when used within its own initialization}}
717 static int n
= -n
; // expected-warning {{variable 'n' is uninitialized when used within its own initialization}}
718 static int o
= std::move(o
); // expected-warning {{variable 'o' is uninitialized when used within its own initialization}}
719 static const int p
= std::move(p
); // expected-warning {{variable 'p' is uninitialized when used within its own initialization}}
720 static int q
= moved(std::move(q
)); // expected-warning {{variable 'q' is uninitialized when used within its own initialization}}
721 static int r
= std::move((p
? q
: (18, r
))); // expected-warning {{variable 'r' is uninitialized when used within its own initialization}}
722 static int s
= r
?: s
; // expected-warning {{variable 's' is uninitialized when used within its own initialization}}
723 static int t
= t
?: s
; // expected-warning {{variable 't' is uninitialized when used within its own initialization}}
724 static int u
= (foo(u
), s
); // expected-warning {{variable 'u' is uninitialized when used within its own initialization}}
725 static int v
= (u
+= v
); // expected-warning {{variable 'v' is uninitialized when used within its own initialization}}
726 static int w
= (w
+= 10); // expected-warning {{variable 'w' is uninitialized when used within its own initialization}}
727 static int x
= x
++; // expected-warning {{variable 'x' is uninitialized when used within its own initialization}}
728 static int y
= ((s
? (y
, v
) : (77, y
))++, sizeof(y
)); // expected-warning {{variable 'y' is uninitialized when used within its own initialization}}
729 static int z
= ++ref(z
); // expected-warning {{variable 'z' is uninitialized when used within its own initialization}}
730 static int aa
= (ref(aa
) += 10); // expected-warning {{variable 'aa' is uninitialized when used within its own initialization}}
731 static int bb
= bb
? x
: y
; // expected-warning {{variable 'bb' is uninitialized when used within its own initialization}}
735 static int a
= a
; // no-warning: used to signal intended lack of initialization.
736 static int b
= b
+ 1; // expected-warning {{static variable 'b' is suspiciously used within its own initialization}}
737 static int c
= (c
+ c
); // expected-warning 2{{static variable 'c' is suspiciously used within its own initialization}}
738 static int d
= ({ d
+ d
;}); // expected-warning 2{{static variable 'd' is suspiciously used within its own initialization}}
739 static int e
= static_cast<long>(e
) + 1; // expected-warning {{static variable 'e' is suspiciously used within its own initialization}}
740 static int f
= foo(f
); // expected-warning {{static variable 'f' is suspiciously used within its own initialization}}
742 // These don't warn as they don't require the value.
743 static int g
= sizeof(g
);
744 static void* ptr
= &ptr
;
745 static int h
= bar(&h
);
746 static int i
= boo(i
);
747 static int j
= far(j
);
748 static int k
= __alignof__(k
);
750 static int l
= k
? l
: l
; // expected-warning 2{{static variable 'l' is suspiciously used within its own initialization}}
751 static int m
= 1 + (k
? m
: m
); // expected-warning 2{{static variable 'm' is suspiciously used within its own initialization}}
752 static int n
= -n
; // expected-warning {{static variable 'n' is suspiciously used within its own initialization}}
753 static int o
= std::move(o
); // expected-warning {{static variable 'o' is suspiciously used within its own initialization}}
754 static const int p
= std::move(p
); // expected-warning {{static variable 'p' is suspiciously used within its own initialization}}
755 static int q
= moved(std::move(q
)); // expected-warning {{static variable 'q' is suspiciously used within its own initialization}}
756 static int r
= std::move((p
? q
: (18, r
))); // expected-warning {{static variable 'r' is suspiciously used within its own initialization}}
757 static int s
= r
?: s
; // expected-warning {{static variable 's' is suspiciously used within its own initialization}}
758 static int t
= t
?: s
; // expected-warning {{static variable 't' is suspiciously used within its own initialization}}
759 static int u
= (foo(u
), s
); // expected-warning {{static variable 'u' is suspiciously used within its own initialization}}
760 static int v
= (u
+= v
); // expected-warning {{static variable 'v' is suspiciously used within its own initialization}}
761 static int w
= (w
+= 10); // expected-warning {{static variable 'w' is suspiciously used within its own initialization}}
762 static int x
= x
++; // expected-warning {{static variable 'x' is suspiciously used within its own initialization}}
763 static int y
= ((s
? (y
, v
) : (77, y
))++, sizeof(y
)); // expected-warning {{static variable 'y' is suspiciously used within its own initialization}}
764 static int z
= ++ref(z
); // expected-warning {{static variable 'z' is suspiciously used within its own initialization}}
765 static int aa
= (ref(aa
) += 10); // expected-warning {{static variable 'aa' is suspiciously used within its own initialization}}
766 static int bb
= bb
? x
: y
; // expected-warning {{static variable 'bb' is suspiciously used within its own initialization}}
769 static int a
= a
; // no-warning: used to signal intended lack of initialization.
770 static int b
= b
+ 1; // expected-warning {{static variable 'b' is suspiciously used within its own initialization}}
771 static int c
= (c
+ c
); // expected-warning 2{{static variable 'c' is suspiciously used within its own initialization}}
772 static int d
= ({ d
+ d
;}); // expected-warning 2{{static variable 'd' is suspiciously used within its own initialization}}
773 static int e
= static_cast<long>(e
) + 1; // expected-warning {{static variable 'e' is suspiciously used within its own initialization}}
774 static int f
= foo(f
); // expected-warning {{static variable 'f' is suspiciously used within its own initialization}}
776 // These don't warn as they don't require the value.
777 static int g
= sizeof(g
);
778 static void* ptr
= &ptr
;
779 static int h
= bar(&h
);
780 static int i
= boo(i
);
781 static int j
= far(j
);
782 static int k
= __alignof__(k
);
784 static int l
= k
? l
: l
; // expected-warning 2{{static variable 'l' is suspiciously used within its own initialization}}
785 static int m
= 1 + (k
? m
: m
); // expected-warning 2{{static variable 'm' is suspiciously used within its own initialization}}
786 static int n
= -n
; // expected-warning {{static variable 'n' is suspiciously used within its own initialization}}
787 static int o
= std::move(o
); // expected-warning {{static variable 'o' is suspiciously used within its own initialization}}
788 static const int p
= std::move(p
); // expected-warning {{static variable 'p' is suspiciously used within its own initialization}}
789 static int q
= moved(std::move(q
)); // expected-warning {{static variable 'q' is suspiciously used within its own initialization}}
790 static int r
= std::move((p
? q
: (18, r
))); // expected-warning {{static variable 'r' is suspiciously used within its own initialization}}
791 static int s
= r
?: s
; // expected-warning {{static variable 's' is suspiciously used within its own initialization}}
792 static int t
= t
?: s
; // expected-warning {{static variable 't' is suspiciously used within its own initialization}}
793 static int u
= (foo(u
), s
); // expected-warning {{static variable 'u' is suspiciously used within its own initialization}}
794 static int v
= (u
+= v
); // expected-warning {{static variable 'v' is suspiciously used within its own initialization}}
795 static int w
= (w
+= 10); // expected-warning {{static variable 'w' is suspiciously used within its own initialization}}
796 static int x
= x
++; // expected-warning {{static variable 'x' is suspiciously used within its own initialization}}
797 static int y
= ((s
? (y
, v
) : (77, y
))++, sizeof(y
)); // expected-warning {{static variable 'y' is suspiciously used within its own initialization}}
798 static int z
= ++ref(z
); // expected-warning {{static variable 'z' is suspiciously used within its own initialization}}
799 static int aa
= (ref(aa
) += 10); // expected-warning {{static variable 'aa' is suspiciously used within its own initialization}}
800 static int bb
= bb
? x
: y
; // expected-warning {{static variable 'bb' is suspiciously used within its own initialization}}
805 namespace in_class_initializers
{
807 S() : a(a
+ 1) {} // expected-warning{{field 'a' is uninitialized when used here}}
808 int a
= 42; // Note: because a is in a member initializer list, this initialization is ignored.
812 T() : b(a
+ 1) {} // No-warning.
818 U() : a(b
+ 1), b(a
+ 1) {} // expected-warning{{field 'b' is uninitialized when used here}}
819 int a
= 42; // Note: because a and b are in the member initializer list, these initializers are ignored.
824 namespace references
{
825 int &a
= a
; // expected-warning{{reference 'a' is not yet bound to a value when used within its own initialization}}
826 int &b(b
); // expected-warning{{reference 'b' is not yet bound to a value when used within its own initialization}}
827 int &c
= a
? b
: c
; // expected-warning{{reference 'c' is not yet bound to a value when used within its own initialization}}
828 int &d
{d
}; // expected-warning{{reference 'd' is not yet bound to a value when used within its own initialization}}
829 int &e
= d
?: e
; // expected-warning{{reference 'e' is not yet bound to a value when used within its own initialization}}
830 int &f
= f
?: d
; // expected-warning{{reference 'f' is not yet bound to a value when used within its own initialization}}
832 int &return_ref1(int);
833 int &return_ref2(int&);
835 int &g
= return_ref1(g
); // expected-warning{{reference 'g' is not yet bound to a value when used within its own initialization}}
836 int &h
= return_ref2(h
); // expected-warning{{reference 'h' is not yet bound to a value when used within its own initialization}}
839 S() : a(a
) {} // expected-warning{{reference 'a' is not yet bound to a value when used here}}
844 int &a
= a
; // expected-warning{{reference 'a' is not yet bound to a value when used within its own initialization}}
845 int &b(b
); // expected-warning{{reference 'b' is not yet bound to a value when used within its own initialization}}
846 int &c
= a
? b
: c
; // expected-warning{{reference 'c' is not yet bound to a value when used within its own initialization}}
847 int &d
{d
}; // expected-warning{{reference 'd' is not yet bound to a value when used within its own initialization}}
851 T() // expected-note{{during field initialization in this constructor}}
852 : a(b
), b(a
) {} // expected-warning{{reference 'b' is not yet bound to a value when used here}}
854 int &c
= c
; // expected-warning{{reference 'c' is not yet bound to a value when used here}}
859 U() : b(a
) {} // No-warning.
865 namespace operators
{
873 A a1
= a1
= makeA(); // expected-warning{{variable 'a1' is uninitialized when used within its own initialization}}
874 A a2
= a2
== a1
; // expected-warning{{variable 'a2' is uninitialized when used within its own initialization}}
875 A a3
= a2
== a3
; // expected-warning{{variable 'a3' is uninitialized when used within its own initialization}}
882 template<typename T
> A(T
) {}
885 A
a0([] { return a0
.x
; }); // ok
887 A
a1([=] { // expected-warning{{variable 'a1' is uninitialized when used within its own initialization}}
890 A
a2([&] { return a2
.x
; }); // ok
894 namespace record_fields
{
901 static A
something(A
&);
905 A
const_ref(const A
&);
912 B(char (*)[1]) : a(a
) {} // expected-warning {{uninitialized}}
913 B(char (*)[2]) : a(a
.get()) {} // expected-warning {{uninitialized}}
914 B(char (*)[3]) : a(a
.num()) {}
915 B(char (*)[4]) : a(a
.copy(a
)) {} // expected-warning {{uninitialized}}
916 B(char (*)[5]) : a(a
.something(a
)) {}
917 B(char (*)[6]) : a(ref(a
)) {}
918 B(char (*)[7]) : a(const_ref(a
)) {}
919 B(char (*)[8]) : a(pointer(&a
)) {}
920 B(char (*)[9]) : a(normal(a
)) {} // expected-warning {{uninitialized}}
921 B(char (*)[10]) : a(std::move(a
)) {} // expected-warning {{uninitialized}}
922 B(char (*)[11]) : a(A(std::move(a
))) {} // expected-warning {{uninitialized}}
923 B(char (*)[12]) : a(rref(std::move(a
))) {} // expected-warning {{uninitialized}}
924 B(char (*)[13]) : a(std::move(x
? a
: (25, a
))) {} // expected-warning 2{{uninitialized}}
927 C() {} // expected-note9{{in this constructor}}
928 A a1
= a1
; // expected-warning {{uninitialized}}
929 A a2
= a2
.get(); // expected-warning {{uninitialized}}
931 A a4
= a4
.copy(a4
); // expected-warning {{uninitialized}}
932 A a5
= a5
.something(a5
);
934 A a7
= const_ref(a7
);
936 A a9
= normal(a9
); // expected-warning {{uninitialized}}
937 const A a10
= a10
; // expected-warning {{uninitialized}}
938 A a11
= std::move(a11
); // expected-warning {{uninitialized}}
939 A a12
= A(std::move(a12
)); // expected-warning {{uninitialized}}
940 A a13
= rref(std::move(a13
)); // expected-warning {{uninitialized}}
941 A a14
= std::move(x
? a13
: (22, a14
)); // expected-warning {{uninitialized}}
943 struct D
{ // expected-note9{{in the implicit default constructor}}
944 A a1
= a1
; // expected-warning {{uninitialized}}
945 A a2
= a2
.get(); // expected-warning {{uninitialized}}
947 A a4
= a4
.copy(a4
); // expected-warning {{uninitialized}}
948 A a5
= a5
.something(a5
);
950 A a7
= const_ref(a7
);
952 A a9
= normal(a9
); // expected-warning {{uninitialized}}
953 const A a10
= a10
; // expected-warning {{uninitialized}}
954 A a11
= std::move(a11
); // expected-warning {{uninitialized}}
955 A a12
= A(std::move(a12
)); // expected-warning {{uninitialized}}
956 A a13
= rref(std::move(a13
)); // expected-warning {{uninitialized}}
957 A a14
= std::move(x
? a13
: (22, a14
)); // expected-warning {{uninitialized}}
959 D d
; // expected-note {{in implicit default constructor for 'record_fields::D' first required here}}
965 A a5
= a5
.something(a5
);
967 A a7
= const_ref(a7
);
971 A a11
= std::move(a11
);
972 A a12
= A(std::move(a12
));
973 A a13
= rref(std::move(a13
));
974 A a14
= std::move(x
? a13
: (22, a14
));
978 namespace cross_field_warnings
{
982 A(char (*)[1]) : b(a
) {} // expected-warning{{field 'a' is uninitialized when used here}}
983 A(char (*)[2]) : a(b
) {} // expected-warning{{field 'b' is uninitialized when used here}}
987 int a
= b
; // expected-warning{{field 'b' is uninitialized when used here}}
989 B() {} // expected-note{{during field initialization in this constructor}}
994 int b
= a
; // expected-warning{{field 'a' is uninitialized when used here}}
995 C(char (*)[1]) : a(5) {}
996 C(char (*)[2]) {} // expected-note{{during field initialization in this constructor}}
1019 F(char (*)[1]) : a(e
.get()) {} // expected-warning{{field 'e' is uninitialized when used here}}
1020 F(char (*)[2]) : a(e
.num()) {}
1021 F(char (*)[3]) : e(a
) {} // expected-warning{{field 'a' is uninitialized when used here}}
1022 F(char (*)[4]) : a(4), e(a
) {}
1023 F(char (*)[5]) : e(b
) {} // expected-warning{{field 'b' is uninitialized when used here}}
1024 F(char (*)[6]) : e(b
), b(4) {} // expected-warning{{field 'b' is uninitialized when used here}}
1043 struct J
: public I
{
1047 J() : I((a
= new int(5))), b(a
), c(*a
) {}
1057 int b
= b
+ 5; // expected-warning{{field 'b' is uninitialized when used here}}
1058 L() : a(5) {} // expected-note{{during field initialization in this constructor}}
1063 struct N
: public M
{
1066 N() : b(a
) { } // expected-warning{{field 'a' is uninitialized when used here}}
1071 int get() { return x
; }
1077 P() : x(o
.get()) { }
1085 a(c
= 5), // expected-warning{{reference 'c' is not yet bound to a value when used here}}
1086 b(c
), // expected-warning{{reference 'c' is not yet bound to a value when used here}}
1095 R() : a(c
= 5), b(c
), c(a
) {}
1098 // FIXME: Use the CFG-based analysis to give a sometimes uninitialized
1104 : x(b
? (y
= 5) : (1 + y
)), // expected-warning{{field 'y' is uninitialized when used here}}
1107 : x(!b
? (1 + y
) : (y
= 5)), // expected-warning{{field 'y' is uninitialized when used here}}
1113 namespace base_class
{
1118 struct B
: public A
{
1120 B() : A(x
) {} // expected-warning{{field 'x' is uninitialized when used here}}
1123 struct C
: public A
{
1126 C() : A(y
= 4), x(y
) {}
1130 namespace delegating_constructor
{
1135 A(char (*)[1]) : A(x
) {}
1136 // expected-warning@-1 {{field 'x' is uninitialized when used here}}
1137 A(char (*)[2]) : A(x
, x
) {}
1138 // expected-warning@-1 {{field 'x' is uninitialized when used here}}
1140 A(char (*)[3]) : A(x
, 0) {}
1146 namespace init_list
{
1148 struct A
{ int i1
, i2
; };
1149 struct B
{ A a1
, a2
; };
1152 A a2
{a2
.i1
+ 2}; // expected-warning{{uninitialized}}
1153 A a3
= {a3
.i1
+ 2}; // expected-warning{{uninitialized}}
1154 A a4
= A
{a4
.i2
+ 2}; // expected-warning{{uninitialized}}
1157 B b2
= { {}, b2
.a1
};
1158 B b3
= { b3
.a1
}; // expected-warning{{uninitialized}}
1159 B b4
= { {}, b4
.a2
} ; // expected-warning{{uninitialized}}
1160 B b5
= { b5
.a2
}; // expected-warning{{uninitialized}}
1162 B b6
= { {b6
.a1
.i1
} }; // expected-warning{{uninitialized}}
1163 B b7
= { {0, b7
.a1
.i1
} };
1164 B b8
= { {}, {b8
.a1
.i1
} };
1165 B b9
= { {}, {0, b9
.a1
.i1
} };
1167 B b10
= { {b10
.a1
.i2
} }; // expected-warning{{uninitialized}}
1168 B b11
= { {0, b11
.a1
.i2
} }; // expected-warning{{uninitialized}}
1169 B b12
= { {}, {b12
.a1
.i2
} };
1170 B b13
= { {}, {0, b13
.a1
.i2
} };
1172 B b14
= { {b14
.a2
.i1
} }; // expected-warning{{uninitialized}}
1173 B b15
= { {0, b15
.a2
.i1
} }; // expected-warning{{uninitialized}}
1174 B b16
= { {}, {b16
.a2
.i1
} }; // expected-warning{{uninitialized}}
1175 B b17
= { {}, {0, b17
.a2
.i1
} };
1177 B b18
= { {b18
.a2
.i2
} }; // expected-warning{{uninitialized}}
1178 B b19
= { {0, b19
.a2
.i2
} }; // expected-warning{{uninitialized}}
1179 B b20
= { {}, {b20
.a2
.i2
} }; // expected-warning{{uninitialized}}
1180 B b21
= { {}, {0, b21
.a2
.i2
} }; // expected-warning{{uninitialized}}
1182 B b22
= { {b18
.a2
.i2
+ 5} };
1184 struct C
{int a
; int& b
; int c
; };
1185 C c1
= { 0, num
, 0 };
1186 C c2
= { 1, num
, c2
.b
};
1187 C c3
= { c3
.b
, num
}; // expected-warning{{uninitialized}}
1188 C c4
= { 0, c4
.b
, 0 }; // expected-warning{{uninitialized}}
1189 C c5
= { 0, c5
.c
, 0 };
1190 C c6
= { c6
.b
, num
, 0 }; // expected-warning{{uninitialized}}
1191 C c7
= { 0, c7
.a
, 0 };
1193 struct D
{int &a
; int &b
; };
1194 D d1
= { num
, num
};
1195 D d2
= { num
, d2
.a
};
1196 D d3
= { d3
.b
, num
}; // expected-warning{{uninitialized}}
1198 // Same as above in member initializer form.
1201 A a2
{a2
.i1
+ 2}; // expected-warning{{uninitialized}}
1202 A a3
= {a3
.i1
+ 2}; // expected-warning{{uninitialized}}
1203 A a4
= A
{a4
.i2
+ 2}; // expected-warning{{uninitialized}}
1204 Awrapper() {} // expected-note 3{{in this constructor}}
1207 a2
{a2
.i1
+ 2}, // expected-warning{{uninitialized}}
1208 a3
{a3
.i1
+ 2}, // expected-warning{{uninitialized}}
1209 a4
{a4
.i2
+ 2} // expected-warning{{uninitialized}}
1215 B b2
= { {}, b2
.a1
};
1216 B b3
= { b3
.a1
}; // expected-warning{{uninitialized}}
1217 B b4
= { {}, b4
.a2
} ; // expected-warning{{uninitialized}}
1218 B b5
= { b5
.a2
}; // expected-warning{{uninitialized}}
1220 B b6
= { {b6
.a1
.i1
} }; // expected-warning{{uninitialized}}
1221 B b7
= { {0, b7
.a1
.i1
} };
1222 B b8
= { {}, {b8
.a1
.i1
} };
1223 B b9
= { {}, {0, b9
.a1
.i1
} };
1225 B b10
= { {b10
.a1
.i2
} }; // expected-warning{{uninitialized}}
1226 B b11
= { {0, b11
.a1
.i2
} }; // expected-warning{{uninitialized}}
1227 B b12
= { {}, {b12
.a1
.i2
} };
1228 B b13
= { {}, {0, b13
.a1
.i2
} };
1230 B b14
= { {b14
.a2
.i1
} }; // expected-warning{{uninitialized}}
1231 B b15
= { {0, b15
.a2
.i1
} }; // expected-warning{{uninitialized}}
1232 B b16
= { {}, {b16
.a2
.i1
} }; // expected-warning{{uninitialized}}
1233 B b17
= { {}, {0, b17
.a2
.i1
} };
1235 B b18
= { {b18
.a2
.i2
} }; // expected-warning{{uninitialized}}
1236 B b19
= { {0, b19
.a2
.i2
} }; // expected-warning{{uninitialized}}
1237 B b20
= { {}, {b20
.a2
.i2
} }; // expected-warning{{uninitialized}}
1238 B b21
= { {}, {0, b21
.a2
.i2
} }; // expected-warning{{uninitialized}}
1240 B b22
= { {b18
.a2
.i2
+ 5} };
1241 Bwrapper() {} // expected-note 13{{in this constructor}}
1245 b3
{ b3
.a1
}, // expected-warning{{uninitialized}}
1246 b4
{ {}, b4
.a2
}, // expected-warning{{uninitialized}}
1247 b5
{ b5
.a2
}, // expected-warning{{uninitialized}}
1249 b6
{ {b6
.a1
.i1
} }, // expected-warning{{uninitialized}}
1250 b7
{ {0, b7
.a1
.i1
} },
1251 b8
{ {}, {b8
.a1
.i1
} },
1252 b9
{ {}, {0, b9
.a1
.i1
} },
1254 b10
{ {b10
.a1
.i2
} }, // expected-warning{{uninitialized}}
1255 b11
{ {0, b11
.a1
.i2
} }, // expected-warning{{uninitialized}}
1256 b12
{ {}, {b12
.a1
.i2
} },
1257 b13
{ {}, {0, b13
.a1
.i2
} },
1259 b14
{ {b14
.a2
.i1
} }, // expected-warning{{uninitialized}}
1260 b15
{ {0, b15
.a2
.i1
} }, // expected-warning{{uninitialized}}
1261 b16
{ {}, {b16
.a2
.i1
} }, // expected-warning{{uninitialized}}
1262 b17
{ {}, {0, b17
.a2
.i1
} },
1264 b18
{ {b18
.a2
.i2
} }, // expected-warning{{uninitialized}}
1265 b19
{ {0, b19
.a2
.i2
} }, // expected-warning{{uninitialized}}
1266 b20
{ {}, {b20
.a2
.i2
} }, // expected-warning{{uninitialized}}
1267 b21
{ {}, {0, b21
.a2
.i2
} }, // expected-warning{{uninitialized}}
1269 b22
{ {b18
.a2
.i2
+ 5} }
1274 C c1
= { 0, num
, 0 };
1275 C c2
= { 1, num
, c2
.b
};
1276 C c3
= { c3
.b
, num
}; // expected-warning{{uninitialized}}
1277 C c4
= { 0, c4
.b
, 0 }; // expected-warning{{uninitialized}}
1278 C c5
= { 0, c5
.c
, 0 };
1279 C c6
= { c6
.b
, num
, 0 }; // expected-warning{{uninitialized}}
1280 C c7
= { 0, c7
.a
, 0 };
1282 Cwrapper() {} // expected-note 3{{in this constructor}}
1286 c3
{ c3
.b
, num
}, // expected-warning{{uninitialized}}
1287 c4
{ 0, c4
.b
, 0 }, // expected-warning{{uninitialized}}
1289 c6
{ c6
.b
, num
, 0 }, // expected-warning{{uninitialized}}
1295 D d1
= { num
, num
};
1296 D d2
= { num
, d2
.a
};
1297 D d3
= { d3
.b
, num
}; // expected-warning{{uninitialized}}
1298 Dwrapper() {} // expected-note{{in this constructor}}
1302 d3
{ d3
.b
, num
} // expected-warning{{uninitialized}}
1317 EFComposed() : f
{ e
->foo() }, e() {} // expected-warning{{uninitialized}}
1321 namespace template_class
{
1324 int *Create() { return nullptr; }
1327 template <typename T
>
1330 // Don't warn on foo here.
1331 A() : ptr(foo
->Create()) {}
1338 template <typename T
>
1341 // foo is uninitialized here, but class B is never instantiated.
1342 B() : ptr(foo
->Create()) {}
1349 template <typename T
>
1352 C() : ptr(foo
->Create()) {}
1353 // expected-warning@-1 {{field 'foo' is uninitialized when used here}}
1360 // expected-note@-1 {{in instantiation of member function 'template_class::C<int>::C' requested here}}
1364 namespace base_class_access
{
1375 struct B
: public A
{
1376 B(int (*)[1]) : A() {}
1377 B(int (*)[2]) : A(bar()) {}
1379 B(int (*)[3]) : A(i
) {}
1380 // expected-warning@-1 {{base class 'base_class_access::A' is uninitialized when used here to access 'base_class_access::A::i'}}
1382 B(int (*)[4]) : A(foo()) {}
1383 // expected-warning@-1 {{base_class_access::A' is uninitialized when used here to access 'base_class_access::A::foo'}}
1390 struct D
: public C
, public A
{
1391 D(int (*)[1]) : C(0) {}
1392 D(int (*)[2]) : C(bar()) {}
1394 D(int (*)[3]) : C(i
) {}
1395 // expected-warning@-1 {{base class 'base_class_access::A' is uninitialized when used here to access 'base_class_access::A::i'}}
1397 D(int (*)[4]) : C(foo()) {}
1398 // expected-warning@-1 {{base_class_access::A' is uninitialized when used here to access 'base_class_access::A::foo'}}
1404 template <class T
> T
move(T t
);
1405 template <class T
> T
notmove(T t
);
1407 namespace lvalueref
{
1408 template <class T
> T
move(T
& t
);
1409 template <class T
> T
notmove(T
& t
);
1411 namespace rvalueref
{
1412 template <class T
> T
move(T
&& t
);
1413 template <class T
> T
notmove(T
&& t
);
1416 namespace move_test
{
1417 int a1
= std::move(a1
); // expected-warning {{uninitialized}}
1418 int a2
= value::move(a2
); // expected-warning {{uninitialized}}
1419 int a3
= value::notmove(a3
); // expected-warning {{uninitialized}}
1420 int a4
= lvalueref::move(a4
);
1421 int a5
= lvalueref::notmove(a5
);
1422 int a6
= rvalueref::move(a6
);
1423 int a7
= rvalueref::notmove(a7
);
1426 int a1
= std::move(a1
); // expected-warning {{uninitialized}}
1427 int a2
= value::move(a2
); // expected-warning {{uninitialized}}
1428 int a3
= value::notmove(a3
); // expected-warning {{uninitialized}}
1429 int a4
= lvalueref::move(a4
);
1430 int a5
= lvalueref::notmove(a5
);
1431 int a6
= rvalueref::move(a6
);
1432 int a7
= rvalueref::notmove(a7
);
1437 A(int (*) [1]) : a(std::move(a
)) {} // expected-warning {{uninitialized}}
1438 A(int (*) [2]) : a(value::move(a
)) {} // expected-warning {{uninitialized}}
1439 A(int (*) [3]) : a(value::notmove(a
)) {} // expected-warning {{uninitialized}}
1440 A(int (*) [4]) : a(lvalueref::move(a
)) {}
1441 A(int (*) [5]) : a(lvalueref::notmove(a
)) {}
1442 A(int (*) [6]) : a(rvalueref::move(a
)) {}
1443 A(int (*) [7]) : a(rvalueref::notmove(a
)) {}
1447 void array_capture(bool b
) {
1448 const char fname
[] = "array_capture";
1450 int unused
; // expected-warning {{unused variable}}
1456 void if_switch_init_stmt(int k
) {
1457 if (int n
= 0; (n
== k
|| k
> 5)) {}
1459 if (int n
; (n
== k
|| k
> 5)) {} // expected-warning {{uninitialized}} expected-note {{initialize}}
1461 switch (int n
= 0; (n
== k
|| k
> 5)) {} // expected-warning {{boolean}}
1463 switch (int n
; (n
== k
|| k
> 5)) {} // expected-warning {{uninitialized}} expected-note {{initialize}} expected-warning {{boolean}}
1466 template<typename T
> struct Outer
{
1473 Outer
<int>::Inner outerinner
;