1 // RUN: %clang_cc1 -std=gnu++11 -Wsometimes-uninitialized -verify %s
2 // RUN: %clang_cc1 -std=gnu++11 -Wsometimes-uninitialized -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
3
4 bool maybe();
5
test_if_false(bool b)6 int test_if_false(bool b) {
7 int x; // expected-note {{variable}}
8 if (b) // expected-warning {{whenever 'if' condition is false}} \
9 // expected-note {{remove the 'if' if its condition is always true}}
10 x = 1;
11 return x; // expected-note {{uninitialized use}}
12 }
13
14 // CHECK: fix-it:"{{.*}}":{8:3-10:5}:""
15 // CHECK: fix-it:"{{.*}}":{7:8-7:8}:" = 0"
16
17
test_if_true(bool b)18 int test_if_true(bool b) {
19 int x; // expected-note {{variable}}
20 if (b) {} // expected-warning {{whenever 'if' condition is true}} \
21 // expected-note {{remove the 'if' if its condition is always false}}
22 else x = 1;
23 return x; // expected-note {{uninitialized use}}
24 }
25
26 // CHECK: fix-it:"{{.*}}":{20:3-22:8}:""
27 // CHECK: fix-it:"{{.*}}":{19:8-19:8}:" = 0"
28
29
test_while_false(bool b)30 int test_while_false(bool b) {
31 int x; // expected-note {{variable}}
32 while (b) { // expected-warning {{whenever 'while' loop exits because its condition is false}} \
33 // expected-note {{remove the condition if it is always true}}
34 if (maybe()) {
35 x = 1;
36 break;
37 }
38 };
39 return x; // expected-note {{uninitialized use}}
40 }
41
42 // CHECK: fix-it:"{{.*}}":{32:10-32:11}:"true"
43 // CHECK: fix-it:"{{.*}}":{31:8-31:8}:" = 0"
44
45
test_while_true(bool b)46 int test_while_true(bool b) {
47 int x; // expected-note {{variable}}
48 while (b) { // expected-warning {{whenever 'while' loop is entered}} \
49 // expected-note {{remove the condition if it is always false}}
50 label:
51 return x; // expected-note {{uninitialized use}}
52 }
53 x = 0;
54 goto label;
55 }
56
57 // CHECK: fix-it:"{{.*}}":{48:10-48:11}:"false"
58 // CHECK: fix-it:"{{.*}}":{47:8-47:8}:" = 0"
59
60
test_do_while_false(bool b)61 int test_do_while_false(bool b) {
62 int x; // expected-note {{variable}}
63 do {
64 if (maybe()) {
65 x = 1;
66 break;
67 }
68 } while (b); // expected-warning {{whenever 'do' loop exits because its condition is false}} \
69 // expected-note {{remove the condition if it is always true}}
70 return x; // expected-note {{uninitialized use}}
71 }
72
73 // CHECK: fix-it:"{{.*}}":{68:12-68:13}:"true"
74 // CHECK: fix-it:"{{.*}}":{62:8-62:8}:" = 0"
75
76
test_do_while_true(bool b)77 int test_do_while_true(bool b) {
78 int x; // expected-note {{variable}}
79 goto label2;
80 do {
81 label1:
82 return x; // expected-note {{uninitialized use}}
83 label2: ;
84 } while (b); // expected-warning {{whenever 'do' loop condition is true}} \
85 // expected-note {{remove the condition if it is always false}}
86 x = 0;
87 goto label1;
88 }
89
90 // CHECK: fix-it:"{{.*}}":{84:12-84:13}:"false"
91 // CHECK: fix-it:"{{.*}}":{78:8-78:8}:" = 0"
92
93
test_for_false(int k)94 int test_for_false(int k) {
95 int x; // expected-note {{variable}}
96 for (int n = 0;
97 n < k; // expected-warning {{whenever 'for' loop exits because its condition is false}} \
98 // expected-note {{remove the condition if it is always true}}
99 ++n) {
100 if (maybe()) {
101 x = n;
102 break;
103 }
104 }
105 return x; // expected-note {{uninitialized use}}
106 }
107
108 // CHECK: fix-it:"{{.*}}":{97:8-97:13}:""
109 // CHECK: fix-it:"{{.*}}":{95:8-95:8}:" = 0"
110
111
test_for_true(int k)112 int test_for_true(int k) {
113 int x; // expected-note {{variable}}
114 int n = 0;
115 for (;
116 n < k; // expected-warning {{whenever 'for' loop is entered}} \
117 // expected-note {{remove the condition if it is always false}}
118 ++n) {
119 label:
120 return x; // expected-note {{uninitialized use}}
121 }
122 x = 1;
123 goto label;
124 }
125
126 // CHECK: fix-it:"{{.*}}":{116:8-116:13}:"false"
127 // CHECK: fix-it:"{{.*}}":{113:8-113:8}:" = 0"
128
129
test_for_range_false(int k)130 int test_for_range_false(int k) {
131 int arr[3] = { 1, 2, 3 };
132 int x;
133 for (int &a : arr) { // no-warning, condition was not explicitly specified
134 if (a == k) {
135 x = &a - arr;
136 break;
137 }
138 }
139 return x;
140 }
141
142
143
144
145
test_for_range_true(int k)146 int test_for_range_true(int k) {
147 int arr[3] = { 1, 2, 3 };
148 int x; // expected-note {{variable}}
149 for (int &a : arr) { // expected-warning {{variable 'x' is used uninitialized whenever 'for' loop is entered}}
150 goto label;
151 }
152 x = 0;
153 label:
154 return x; // expected-note {{uninitialized use}}
155 }
156
157
158
159
160
test_conditional_false(int k)161 int test_conditional_false(int k) {
162 int x; // expected-note {{variable}}
163 (void)(
164 maybe() // expected-warning {{whenever '?:' condition is false}} \
165 // expected-note {{remove the '?:' if its condition is always true}}
166 ? x = 1 : 0);
167 return x; // expected-note {{uninitialized use}}
168 }
169
170 // CHECK: fix-it:"{{.*}}":{164:7-166:9}:""
171 // CHECK: fix-it:"{{.*}}":{166:14-166:18}:""
172 // CHECK: fix-it:"{{.*}}":{162:8-162:8}:" = 0"
173
test_conditional_true(int k)174 int test_conditional_true(int k) {
175 int x; // expected-note {{variable}}
176 (void)(
177 maybe() // expected-warning {{whenever '?:' condition is true}} \
178 // expected-note {{remove the '?:' if its condition is always false}}
179 ? 0 : x = 1);
180 return x; // expected-note {{uninitialized use}}
181 }
182
183 // CHECK: fix-it:"{{.*}}":{177:7-179:13}:""
184 // CHECK: fix-it:"{{.*}}":{175:8-175:8}:" = 0"
185
186
test_logical_and_false(int k)187 int test_logical_and_false(int k) {
188 int x; // expected-note {{variable}}
189 maybe() // expected-warning {{whenever '&&' condition is false}} \
190 // expected-note {{remove the '&&' if its condition is always true}}
191 && (x = 1);
192 return x; // expected-note {{uninitialized use}}
193 }
194
195 // CHECK: fix-it:"{{.*}}":{189:3-191:10}:""
196 // CHECK: fix-it:"{{.*}}":{188:8-188:8}:" = 0"
197
198
test_logical_and_true(int k)199 int test_logical_and_true(int k) {
200 int x; // expected-note {{variable}}
201 maybe() // expected-warning {{whenever '&&' condition is true}} \
202 // expected-note {{remove the '&&' if its condition is always false}}
203 && ({ goto skip_init; 0; });
204 x = 1;
205 skip_init:
206 return x; // expected-note {{uninitialized use}}
207 }
208
209 // CHECK: fix-it:"{{.*}}":{201:3-203:34}:"false"
210 // CHECK: fix-it:"{{.*}}":{200:8-200:8}:" = 0"
211
212
test_logical_or_false(int k)213 int test_logical_or_false(int k) {
214 int x; // expected-note {{variable}}
215 maybe() // expected-warning {{whenever '||' condition is false}} \
216 // expected-note {{remove the '||' if its condition is always true}}
217 || ({ goto skip_init; 0; });
218 x = 1;
219 skip_init:
220 return x; // expected-note {{uninitialized use}}
221 }
222
223 // CHECK: fix-it:"{{.*}}":{215:3-217:34}:"true"
224 // CHECK: fix-it:"{{.*}}":{214:8-214:8}:" = 0"
225
226
test_logical_or_true(int k)227 int test_logical_or_true(int k) {
228 int x; // expected-note {{variable}}
229 maybe() // expected-warning {{whenever '||' condition is true}} \
230 // expected-note {{remove the '||' if its condition is always false}}
231 || (x = 1);
232 return x; // expected-note {{uninitialized use}}
233 }
234
235 // CHECK: fix-it:"{{.*}}":{229:3-231:10}:""
236 // CHECK: fix-it:"{{.*}}":{228:8-228:8}:" = 0"
237
238
test_switch_case(int k)239 int test_switch_case(int k) {
240 int x; // expected-note {{variable}}
241 switch (k) {
242 case 0:
243 x = 0;
244 break;
245 case 1: // expected-warning {{whenever switch case is taken}}
246 break;
247 }
248 return x; // expected-note {{uninitialized use}}
249 }
250
251 // CHECK: fix-it:"{{.*}}":{240:8-240:8}:" = 0"
252
253
254
test_switch_default(int k)255 int test_switch_default(int k) {
256 int x; // expected-note {{variable}}
257 switch (k) {
258 case 0:
259 x = 0;
260 break;
261 case 1:
262 x = 1;
263 break;
264 default: // expected-warning {{whenever switch default is taken}}
265 break;
266 }
267 return x; // expected-note {{uninitialized use}}
268 }
269
270 // CHECK: fix-it:"{{.*}}":{256:8-256:8}:" = 0"
271
272
273
test_switch_suppress_1(int k)274 int test_switch_suppress_1(int k) {
275 int x;
276 switch (k) {
277 case 0:
278 x = 0;
279 break;
280 case 1:
281 x = 1;
282 break;
283 }
284 return x; // no-warning
285 }
286
287
288
289
290
test_switch_suppress_2(int k)291 int test_switch_suppress_2(int k) {
292 int x;
293 switch (k) {
294 case 0:
295 case 1:
296 switch (k) {
297 case 0:
298 return 0;
299 case 1:
300 return 1;
301 }
302 case 2:
303 case 3:
304 x = 1;
305 }
306 return x; // no-warning
307 }
308
309
310
311
312
test_multiple_notes(int k)313 int test_multiple_notes(int k) {
314 int x; // expected-note {{variable}}
315 if (k > 0) {
316 if (k == 5)
317 x = 1;
318 else if (k == 2) // expected-warning {{whenever 'if' condition is false}} \
319 // expected-note {{remove the 'if' if its condition is always true}}
320 x = 2;
321 } else {
322 if (k == -5)
323 x = 3;
324 else if (k == -2) // expected-warning {{whenever 'if' condition is false}} \
325 // expected-note {{remove the 'if' if its condition is always true}}
326 x = 4;
327 }
328 return x; // expected-note 2{{uninitialized use}}
329 }
330
331 // CHECK: fix-it:"{{.*}}":{324:10-326:7}:""
332 // CHECK: fix-it:"{{.*}}":{318:10-320:7}:""
333 // CHECK: fix-it:"{{.*}}":{314:8-314:8}:" = 0"
334
test_no_false_positive_1(int k)335 int test_no_false_positive_1(int k) {
336 int x;
337 if (k)
338 x = 5;
339 while (!k)
340 maybe();
341 return x;
342 }
343
344
345
346
347
test_no_false_positive_2()348 int test_no_false_positive_2() {
349 int x;
350 bool b = false;
351 if (maybe()) {
352 x = 5;
353 b = true;
354 }
355 return b ? x : 0;
356 }
357
358
359
360
361
test_null_pred_succ()362 void test_null_pred_succ() {
363 int x; // expected-note {{variable}} expected-warning {{used uninitialized whenever function 'test_null_pred_succ' is called}}
364 if (0)
365 foo: x = 0;
366 if (x) // expected-note {{use}}
367 goto foo;
368 }
369
370
371
372
373 void foo();
PR13360(bool b)374 int PR13360(bool b) {
375 int x; // expected-note {{variable}}
376 if (b) { // expected-warning {{variable 'x' is used uninitialized whenever 'if' condition is true}} expected-note {{remove}}
377 do {
378 foo();
379 } while (0);
380 } else {
381 x = 1;
382 }
383 return x; // expected-note {{uninitialized use occurs here}}
384 }
385
386 // CHECK: fix-it:"{{.*}}":{376:3-380:10}:""
387 // CHECK: fix-it:"{{.*}}":{375:8-375:8}:" = 0"
388
test_jump_init()389 void test_jump_init() {
390 goto later;
391 int x; // expected-note {{variable}} expected-warning {{used uninitialized whenever function 'test_jump_init'}}
392 later:
393 while (x) x = 0; // expected-note {{use}}
394 }
395
PR16054()396 void PR16054() {
397 int x; // expected-note {{variable}} expected-warning {{used uninitialized whenever function 'PR16054}}
398 while (x != 0) { // expected-note {{use}}
399 (void)&x;
400 }
401 }
402
test_loop_uninit()403 void test_loop_uninit() {
404 for (int n = 0; n < 10; ++n) {
405 int k; // expected-warning {{variable 'k' is used uninitialized whenever its declaration is reached}} expected-note {{variable}}
406 do {
407 k = k + 1; // expected-note {{use}}
408 } while (k != 5);
409 }
410 }
411
412 // FIXME: We should warn here, because the variable is used uninitialized
413 // the first time we encounter the use.
test_loop_with_assignment()414 void test_loop_with_assignment() {
415 double d;
416 for (int n = 0; n < 10; ++n) {
417 d = d + n;
418 }
419 }
420
421 // FIXME: We should warn here, because the variable is used uninitialized
422 // the first time we encounter the use.
test_loop_with_ref_bind()423 void test_loop_with_ref_bind() {
424 double d;
425 for (int n = 0; n < 10; ++n) {
426 d += n;
427 const double &r = d;
428 }
429 }
430