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 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 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 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 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 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 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 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 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 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 146 int test_for_range_true(int k) { 147 int arr[3] = { 1, 2, 3 }; 148 int x; 149 for (int &a : arr) { // no-warning 150 goto label; 151 } 152 x = 0; 153 label: 154 return x; 155 } 156 157 158 159 160 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 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 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 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 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 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 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 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 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 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 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 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 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 // FIXME: In this case, the variable is used uninitialized whenever the 360 // function's entry block is reached. Produce a diagnostic saying that 361 // the variable is uninitialized the first time it is used. 362 void test_null_pred_succ() { 363 int x; 364 if (0) 365 foo: x = 0; 366 if (x) 367 goto foo; 368 } 369 370 371 372 373 void foo(); 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