12815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith// RUN: %clang_cc1 -std=gnu++11 -Wsometimes-uninitialized -verify %s
2bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// RUN: %clang_cc1 -std=gnu++11 -Wsometimes-uninitialized -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
32815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith
42815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithbool maybe();
52815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith
62815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithint test_if_false(bool b) {
72815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  int x; // expected-note {{variable}}
8bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  if (b) // expected-warning {{whenever 'if' condition is false}} \
9bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith         // expected-note {{remove the 'if' if its condition is always true}}
10bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith    x = 1;
11bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  return x; // expected-note {{uninitialized use}}
122815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith}
132815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith
14bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{8:3-10:5}:""
15bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{7:8-7:8}:" = 0"
16bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
17bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
182815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithint test_if_true(bool b) {
192815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  int x; // expected-note {{variable}}
20bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  if (b) {} // expected-warning {{whenever 'if' condition is true}} \
21bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith            // expected-note {{remove the 'if' if its condition is always false}}
222815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  else x = 1;
23bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  return x; // expected-note {{uninitialized use}}
242815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith}
252815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith
26bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{20:3-22:8}:""
27bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{19:8-19:8}:" = 0"
28bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
29bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
302815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithint test_while_false(bool b) {
312815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  int x; // expected-note {{variable}}
32bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  while (b) { // expected-warning {{whenever 'while' loop exits because its condition is false}} \
33bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith              // expected-note {{remove the condition if it is always true}}
342815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    if (maybe()) {
352815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith      x = 1;
362815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith      break;
372815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    }
382815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  };
39bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  return x; // expected-note {{uninitialized use}}
402815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith}
412815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith
42bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{32:10-32:11}:"true"
43bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{31:8-31:8}:" = 0"
44bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
45bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
462815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithint test_while_true(bool b) {
472815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  int x; // expected-note {{variable}}
48bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  while (b) { // expected-warning {{whenever 'while' loop is entered}} \
49bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith              // expected-note {{remove the condition if it is always false}}
502815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithlabel:
51bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith    return x; // expected-note {{uninitialized use}}
522815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  }
532815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  x = 0;
542815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  goto label;
552815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith}
562815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith
57bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{48:10-48:11}:"false"
58bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{47:8-47:8}:" = 0"
59bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
60bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
612815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithint test_do_while_false(bool b) {
622815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  int x; // expected-note {{variable}}
632815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  do {
642815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    if (maybe()) {
652815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith      x = 1;
662815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith      break;
672815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    }
68bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  } while (b); // expected-warning {{whenever 'do' loop exits because its condition is false}} \
69bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith               // expected-note {{remove the condition if it is always true}}
70bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  return x; // expected-note {{uninitialized use}}
712815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith}
722815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith
73bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{68:12-68:13}:"true"
74bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{62:8-62:8}:" = 0"
75bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
76bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
772815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithint test_do_while_true(bool b) {
782815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  int x; // expected-note {{variable}}
792815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithgoto label2;
802815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  do {
812815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithlabel1:
82bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith    return x; // expected-note {{uninitialized use}}
832815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithlabel2: ;
84bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  } while (b); // expected-warning {{whenever 'do' loop condition is true}} \
85bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith               // expected-note {{remove the condition if it is always false}}
862815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  x = 0;
872815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  goto label1;
882815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith}
892815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith
90bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{84:12-84:13}:"false"
91bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{78:8-78:8}:" = 0"
92bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
93bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
942815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithint test_for_false(int k) {
952815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  int x; // expected-note {{variable}}
962815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  for (int n = 0;
97bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith       n < k; // expected-warning {{whenever 'for' loop exits because its condition is false}} \
98bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith              // expected-note {{remove the condition if it is always true}}
992815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith       ++n) {
1002815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    if (maybe()) {
1012815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith      x = n;
1022815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith      break;
1032815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    }
1042815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  }
105bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  return x; // expected-note {{uninitialized use}}
1062815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith}
1072815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith
108bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{97:8-97:13}:""
109bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{95:8-95:8}:" = 0"
110bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
111bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
1122815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithint test_for_true(int k) {
1132815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  int x; // expected-note {{variable}}
1142815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  int n = 0;
1152815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  for (;
116bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith       n < k; // expected-warning {{whenever 'for' loop is entered}} \
117bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith              // expected-note {{remove the condition if it is always false}}
1182815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith       ++n) {
1192815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithlabel:
120bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith    return x; // expected-note {{uninitialized use}}
1212815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  }
1222815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  x = 1;
1232815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  goto label;
1242815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith}
1252815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith
126bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{116:8-116:13}:"false"
127bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{113:8-113:8}:" = 0"
128bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
129bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
1302815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithint test_for_range_false(int k) {
1312815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  int arr[3] = { 1, 2, 3 };
132bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  int x;
133bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  for (int &a : arr) { // no-warning, condition was not explicitly specified
1342815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    if (a == k) {
1352815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith      x = &a - arr;
1362815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith      break;
1372815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    }
1382815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  }
139bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  return x;
1402815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith}
1412815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith
142bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
143bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
144bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
145bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
1462815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithint test_for_range_true(int k) {
1472815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  int arr[3] = { 1, 2, 3 };
1488a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith  int x; // expected-note {{variable}}
1498a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith  for (int &a : arr) { // expected-warning {{variable 'x' is used uninitialized whenever 'for' loop is entered}}
1502815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    goto label;
1512815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  }
1522815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  x = 0;
1532815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithlabel:
1548a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith  return x; // expected-note {{uninitialized use}}
1552815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith}
1562815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith
157bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
158bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
159bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
160bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
1612815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithint test_conditional_false(int k) {
1622815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  int x; // expected-note {{variable}}
1632815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  (void)(
164bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith      maybe() // expected-warning {{whenever '?:' condition is false}} \
165bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith              // expected-note {{remove the '?:' if its condition is always true}}
1662815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith      ? x = 1 : 0);
167bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  return x; // expected-note {{uninitialized use}}
1682815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith}
1692815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith
170bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{164:7-166:9}:""
171bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{166:14-166:18}:""
172bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{162:8-162:8}:" = 0"
173bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
1742815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithint test_conditional_true(int k) {
1752815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  int x; // expected-note {{variable}}
1762815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  (void)(
177bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith      maybe() // expected-warning {{whenever '?:' condition is true}} \
178bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith              // expected-note {{remove the '?:' if its condition is always false}}
1792815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith      ? 0 : x = 1);
180bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  return x; // expected-note {{uninitialized use}}
1812815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith}
1822815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith
183bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{177:7-179:13}:""
184bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{175:8-175:8}:" = 0"
185bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
186bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
1872815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithint test_logical_and_false(int k) {
1882815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  int x; // expected-note {{variable}}
189bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  maybe() // expected-warning {{whenever '&&' condition is false}} \
190bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith          // expected-note {{remove the '&&' if its condition is always true}}
1912815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith      && (x = 1);
192bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  return x; // expected-note {{uninitialized use}}
1932815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith}
1942815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith
1955964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis// CHECK: fix-it:"{{.*}}":{189:3-191:10}:""
196bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{188:8-188:8}:" = 0"
197bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
198bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
1992815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithint test_logical_and_true(int k) {
2002815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  int x; // expected-note {{variable}}
201bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  maybe() // expected-warning {{whenever '&&' condition is true}} \
202bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith          // expected-note {{remove the '&&' if its condition is always false}}
2032815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith      && ({ goto skip_init; 0; });
2042815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  x = 1;
2052815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithskip_init:
206bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  return x; // expected-note {{uninitialized use}}
2072815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith}
2082815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith
209bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{201:3-203:34}:"false"
210bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{200:8-200:8}:" = 0"
211bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
212bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
2132815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithint test_logical_or_false(int k) {
2142815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  int x; // expected-note {{variable}}
215bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  maybe() // expected-warning {{whenever '||' condition is false}} \
216bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith          // expected-note {{remove the '||' if its condition is always true}}
2172815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith      || ({ goto skip_init; 0; });
2182815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  x = 1;
2192815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithskip_init:
220bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  return x; // expected-note {{uninitialized use}}
2212815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith}
2222815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith
223bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{215:3-217:34}:"true"
224bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{214:8-214:8}:" = 0"
225bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
226bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
2272815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithint test_logical_or_true(int k) {
2282815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  int x; // expected-note {{variable}}
229bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  maybe() // expected-warning {{whenever '||' condition is true}} \
230bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith          // expected-note {{remove the '||' if its condition is always false}}
2312815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith      || (x = 1);
232bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  return x; // expected-note {{uninitialized use}}
2332815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith}
2342815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith
2355964df144c21c548b9963f2ca35e0fa852b2f6f7Argyrios Kyrtzidis// CHECK: fix-it:"{{.*}}":{229:3-231:10}:""
236bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{228:8-228:8}:" = 0"
237bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
238bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
2392815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithint test_switch_case(int k) {
2402815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  int x; // expected-note {{variable}}
2412815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  switch (k) {
2422815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  case 0:
2432815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    x = 0;
2442815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    break;
245bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  case 1: // expected-warning {{whenever switch case is taken}}
2462815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    break;
2472815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  }
248bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  return x; // expected-note {{uninitialized use}}
2492815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith}
2502815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith
251bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{240:8-240:8}:" = 0"
252bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
253bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
254bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
2552815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithint test_switch_default(int k) {
2562815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  int x; // expected-note {{variable}}
2572815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  switch (k) {
2582815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  case 0:
2592815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    x = 0;
2602815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    break;
2612815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  case 1:
2622815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    x = 1;
2632815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    break;
264bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  default: // expected-warning {{whenever switch default is taken}}
2652815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    break;
2662815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  }
267bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  return x; // expected-note {{uninitialized use}}
2682815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith}
2692815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith
270bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{256:8-256:8}:" = 0"
271bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
272bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
273bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
2742815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithint test_switch_suppress_1(int k) {
2752815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  int x;
2762815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  switch (k) {
2772815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  case 0:
2782815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    x = 0;
2792815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    break;
2802815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  case 1:
2812815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    x = 1;
2822815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    break;
2832815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  }
2842815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  return x; // no-warning
2852815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith}
2862815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith
287bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
288bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
289bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
290bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
2912815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithint test_switch_suppress_2(int k) {
2922815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  int x;
2932815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  switch (k) {
2942815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  case 0:
2952815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  case 1:
2962815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    switch (k) {
2972815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    case 0:
2982815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith      return 0;
2992815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    case 1:
3002815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith      return 1;
3012815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    }
3022815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  case 2:
3032815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  case 3:
3042815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    x = 1;
3052815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  }
3062815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  return x; // no-warning
3072815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith}
3082815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith
309bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
310bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
311bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
312bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
3132815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithint test_multiple_notes(int k) {
3142815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  int x; // expected-note {{variable}}
3152815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  if (k > 0) {
3162815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    if (k == 5)
3172815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith      x = 1;
318bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith    else if (k == 2) // expected-warning {{whenever 'if' condition is false}} \
319bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith                     // expected-note {{remove the 'if' if its condition is always true}}
3202815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith      x = 2;
3212815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  } else {
3222815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    if (k == -5)
3232815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith      x = 3;
324bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith    else if (k == -2) // expected-warning {{whenever 'if' condition is false}} \
325bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith                      // expected-note {{remove the 'if' if its condition is always true}}
3262815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith      x = 4;
3272815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  }
328bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith  return x; // expected-note 2{{uninitialized use}}
3292815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith}
3302815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith
331bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{324:10-326:7}:""
332bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{318:10-320:7}:""
333bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith// CHECK: fix-it:"{{.*}}":{314:8-314:8}:" = 0"
334bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
3352815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithint test_no_false_positive_1(int k) {
3362815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  int x;
3372815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  if (k)
3382815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    x = 5;
3392815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  while (!k)
3402815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    maybe();
3412815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  return x;
3422815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith}
3432815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith
344bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
345bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
346bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
347bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
3482815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smithint test_no_false_positive_2() {
3492815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  int x;
3502815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  bool b = false;
3512815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  if (maybe()) {
3522815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    x = 5;
3532815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith    b = true;
3542815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  }
3552815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  return b ? x : 0;
3562815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith}
3572815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith
358bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
3598a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith
3608a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith
3618a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith
362558e8872b364b43ab9f201dd6b2df9a5b74b0542Richard Smithvoid test_null_pred_succ() {
3638a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith  int x; // expected-note {{variable}} expected-warning {{used uninitialized whenever function 'test_null_pred_succ' is called}}
364558e8872b364b43ab9f201dd6b2df9a5b74b0542Richard Smith  if (0)
365558e8872b364b43ab9f201dd6b2df9a5b74b0542Richard Smith    foo: x = 0;
3668a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith  if (x) // expected-note {{use}}
367558e8872b364b43ab9f201dd6b2df9a5b74b0542Richard Smith    goto foo;
368558e8872b364b43ab9f201dd6b2df9a5b74b0542Richard Smith}
369bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
370bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
371bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
372558e8872b364b43ab9f201dd6b2df9a5b74b0542Richard Smith
373558e8872b364b43ab9f201dd6b2df9a5b74b0542Richard Smithvoid foo();
374558e8872b364b43ab9f201dd6b2df9a5b74b0542Richard Smithint PR13360(bool b) {
3752815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith  int x; // expected-note {{variable}}
376558e8872b364b43ab9f201dd6b2df9a5b74b0542Richard Smith  if (b) { // expected-warning {{variable 'x' is used uninitialized whenever 'if' condition is true}} expected-note {{remove}}
377558e8872b364b43ab9f201dd6b2df9a5b74b0542Richard Smith    do {
378558e8872b364b43ab9f201dd6b2df9a5b74b0542Richard Smith      foo();
379558e8872b364b43ab9f201dd6b2df9a5b74b0542Richard Smith    } while (0);
380558e8872b364b43ab9f201dd6b2df9a5b74b0542Richard Smith  } else {
381558e8872b364b43ab9f201dd6b2df9a5b74b0542Richard Smith    x = 1;
382558e8872b364b43ab9f201dd6b2df9a5b74b0542Richard Smith  }
383558e8872b364b43ab9f201dd6b2df9a5b74b0542Richard Smith  return x; // expected-note {{uninitialized use occurs here}}
3842815e1a075c74143a0b60a632090ece1dffa5c7cRichard Smith}
385bdb97ff687ce85e45cc728b87612ed546f48c1e7Richard Smith
386558e8872b364b43ab9f201dd6b2df9a5b74b0542Richard Smith// CHECK: fix-it:"{{.*}}":{376:3-380:10}:""
387558e8872b364b43ab9f201dd6b2df9a5b74b0542Richard Smith// CHECK: fix-it:"{{.*}}":{375:8-375:8}:" = 0"
3888a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith
3898a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smithvoid test_jump_init() {
3908a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smithgoto later;
3918a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith  int x; // expected-note {{variable}} expected-warning {{used uninitialized whenever function 'test_jump_init'}}
3928a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smithlater:
3938a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith  while (x) x = 0; // expected-note {{use}}
3948a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith}
3958a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith
3968a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smithvoid PR16054() {
3978a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith  int x; // expected-note {{variable}} expected-warning {{used uninitialized whenever function 'PR16054}}
3988a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith  while (x != 0) { // expected-note {{use}}
3998a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith    (void)&x;
4008a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith  }
4018a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith}
4028a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith
4038a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smithvoid test_loop_uninit() {
4048a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith  for (int n = 0; n < 10; ++n) {
4058a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith    int k; // expected-warning {{variable 'k' is used uninitialized whenever its declaration is reached}} expected-note {{variable}}
4068a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith    do {
4078a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith      k = k + 1; // expected-note {{use}}
4088a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith    } while (k != 5);
4098a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith  }
4108a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith}
4118a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith
4128a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith// FIXME: We should warn here, because the variable is used uninitialized
4138a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith// the first time we encounter the use.
4148a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smithvoid test_loop_with_assignment() {
4158a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith  double d;
4168a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith  for (int n = 0; n < 10; ++n) {
4178a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith    d = d + n;
4188a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith  }
4198a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith}
4208a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith
4218a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith// FIXME: We should warn here, because the variable is used uninitialized
4228a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith// the first time we encounter the use.
4238a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smithvoid test_loop_with_ref_bind() {
4248a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith  double d;
4258a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith  for (int n = 0; n < 10; ++n) {
4268a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith    d += n;
4278a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith    const double &r = d;
4288a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith  }
4298a1fdfc69cc6c2ccbfd57fc8ff643c589da9df9bRichard Smith}
430