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