aboutsummaryrefslogtreecommitdiff
path: root/test/Analysis/uninit-sometimes.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2012-08-15 20:02:54 +0000
committerDimitry Andric <dim@FreeBSD.org>2012-08-15 20:02:54 +0000
commit56d91b49b13fe55c918afbda19f6165b5fbff87a (patch)
tree9abb1a658a297776086f4e0dfa6ca533de02104e /test/Analysis/uninit-sometimes.cpp
parent41e20f564abdb05101d6b2b29c59459a966c22cc (diff)
downloadsrc-56d91b49b13fe55c918afbda19f6165b5fbff87a.tar.gz
src-56d91b49b13fe55c918afbda19f6165b5fbff87a.zip
Vendor import of clang trunk r161861:vendor/clang/clang-trunk-r161861
Notes
Notes: svn path=/vendor/clang/dist/; revision=239313 svn path=/vendor/clang/clang-trunk-r161861/; revision=239314; tag=vendor/clang/clang-trunk-r161861
Diffstat (limited to 'test/Analysis/uninit-sometimes.cpp')
-rw-r--r--test/Analysis/uninit-sometimes.cpp387
1 files changed, 387 insertions, 0 deletions
diff --git a/test/Analysis/uninit-sometimes.cpp b/test/Analysis/uninit-sometimes.cpp
new file mode 100644
index 000000000000..7825e8734616
--- /dev/null
+++ b/test/Analysis/uninit-sometimes.cpp
@@ -0,0 +1,387 @@
+// RUN: %clang_cc1 -std=gnu++11 -Wsometimes-uninitialized -verify %s
+// RUN: %clang_cc1 -std=gnu++11 -Wsometimes-uninitialized -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
+
+bool maybe();
+
+int test_if_false(bool b) {
+ int x; // expected-note {{variable}}
+ if (b) // expected-warning {{whenever 'if' condition is false}} \
+ // expected-note {{remove the 'if' if its condition is always true}}
+ x = 1;
+ return x; // expected-note {{uninitialized use}}
+}
+
+// CHECK: fix-it:"{{.*}}":{8:3-10:5}:""
+// CHECK: fix-it:"{{.*}}":{7:8-7:8}:" = 0"
+
+
+int test_if_true(bool b) {
+ int x; // expected-note {{variable}}
+ if (b) {} // expected-warning {{whenever 'if' condition is true}} \
+ // expected-note {{remove the 'if' if its condition is always false}}
+ else x = 1;
+ return x; // expected-note {{uninitialized use}}
+}
+
+// CHECK: fix-it:"{{.*}}":{20:3-22:8}:""
+// CHECK: fix-it:"{{.*}}":{19:8-19:8}:" = 0"
+
+
+int test_while_false(bool b) {
+ int x; // expected-note {{variable}}
+ while (b) { // expected-warning {{whenever 'while' loop exits because its condition is false}} \
+ // expected-note {{remove the condition if it is always true}}
+ if (maybe()) {
+ x = 1;
+ break;
+ }
+ };
+ return x; // expected-note {{uninitialized use}}
+}
+
+// CHECK: fix-it:"{{.*}}":{32:10-32:11}:"true"
+// CHECK: fix-it:"{{.*}}":{31:8-31:8}:" = 0"
+
+
+int test_while_true(bool b) {
+ int x; // expected-note {{variable}}
+ while (b) { // expected-warning {{whenever 'while' loop is entered}} \
+ // expected-note {{remove the condition if it is always false}}
+label:
+ return x; // expected-note {{uninitialized use}}
+ }
+ x = 0;
+ goto label;
+}
+
+// CHECK: fix-it:"{{.*}}":{48:10-48:11}:"false"
+// CHECK: fix-it:"{{.*}}":{47:8-47:8}:" = 0"
+
+
+int test_do_while_false(bool b) {
+ int x; // expected-note {{variable}}
+ do {
+ if (maybe()) {
+ x = 1;
+ break;
+ }
+ } while (b); // expected-warning {{whenever 'do' loop exits because its condition is false}} \
+ // expected-note {{remove the condition if it is always true}}
+ return x; // expected-note {{uninitialized use}}
+}
+
+// CHECK: fix-it:"{{.*}}":{68:12-68:13}:"true"
+// CHECK: fix-it:"{{.*}}":{62:8-62:8}:" = 0"
+
+
+int test_do_while_true(bool b) {
+ int x; // expected-note {{variable}}
+goto label2;
+ do {
+label1:
+ return x; // expected-note {{uninitialized use}}
+label2: ;
+ } while (b); // expected-warning {{whenever 'do' loop condition is true}} \
+ // expected-note {{remove the condition if it is always false}}
+ x = 0;
+ goto label1;
+}
+
+// CHECK: fix-it:"{{.*}}":{84:12-84:13}:"false"
+// CHECK: fix-it:"{{.*}}":{78:8-78:8}:" = 0"
+
+
+int test_for_false(int k) {
+ int x; // expected-note {{variable}}
+ for (int n = 0;
+ n < k; // expected-warning {{whenever 'for' loop exits because its condition is false}} \
+ // expected-note {{remove the condition if it is always true}}
+ ++n) {
+ if (maybe()) {
+ x = n;
+ break;
+ }
+ }
+ return x; // expected-note {{uninitialized use}}
+}
+
+// CHECK: fix-it:"{{.*}}":{97:8-97:13}:""
+// CHECK: fix-it:"{{.*}}":{95:8-95:8}:" = 0"
+
+
+int test_for_true(int k) {
+ int x; // expected-note {{variable}}
+ int n = 0;
+ for (;
+ n < k; // expected-warning {{whenever 'for' loop is entered}} \
+ // expected-note {{remove the condition if it is always false}}
+ ++n) {
+label:
+ return x; // expected-note {{uninitialized use}}
+ }
+ x = 1;
+ goto label;
+}
+
+// CHECK: fix-it:"{{.*}}":{116:8-116:13}:"false"
+// CHECK: fix-it:"{{.*}}":{113:8-113:8}:" = 0"
+
+
+int test_for_range_false(int k) {
+ int arr[3] = { 1, 2, 3 };
+ int x;
+ for (int &a : arr) { // no-warning, condition was not explicitly specified
+ if (a == k) {
+ x = &a - arr;
+ break;
+ }
+ }
+ return x;
+}
+
+
+
+
+
+int test_for_range_true(int k) {
+ int arr[3] = { 1, 2, 3 };
+ int x;
+ for (int &a : arr) { // no-warning
+ goto label;
+ }
+ x = 0;
+label:
+ return x;
+}
+
+
+
+
+
+int test_conditional_false(int k) {
+ int x; // expected-note {{variable}}
+ (void)(
+ maybe() // expected-warning {{whenever '?:' condition is false}} \
+ // expected-note {{remove the '?:' if its condition is always true}}
+ ? x = 1 : 0);
+ return x; // expected-note {{uninitialized use}}
+}
+
+// CHECK: fix-it:"{{.*}}":{164:7-166:9}:""
+// CHECK: fix-it:"{{.*}}":{166:14-166:18}:""
+// CHECK: fix-it:"{{.*}}":{162:8-162:8}:" = 0"
+
+int test_conditional_true(int k) {
+ int x; // expected-note {{variable}}
+ (void)(
+ maybe() // expected-warning {{whenever '?:' condition is true}} \
+ // expected-note {{remove the '?:' if its condition is always false}}
+ ? 0 : x = 1);
+ return x; // expected-note {{uninitialized use}}
+}
+
+// CHECK: fix-it:"{{.*}}":{177:7-179:13}:""
+// CHECK: fix-it:"{{.*}}":{175:8-175:8}:" = 0"
+
+
+int test_logical_and_false(int k) {
+ int x; // expected-note {{variable}}
+ maybe() // expected-warning {{whenever '&&' condition is false}} \
+ // expected-note {{remove the '&&' if its condition is always true}}
+ && (x = 1);
+ return x; // expected-note {{uninitialized use}}
+}
+
+// CHECK: fix-it:"{{.*}}":{189:3-191:9}:""
+// CHECK: fix-it:"{{.*}}":{188:8-188:8}:" = 0"
+
+
+int test_logical_and_true(int k) {
+ int x; // expected-note {{variable}}
+ maybe() // expected-warning {{whenever '&&' condition is true}} \
+ // expected-note {{remove the '&&' if its condition is always false}}
+ && ({ goto skip_init; 0; });
+ x = 1;
+skip_init:
+ return x; // expected-note {{uninitialized use}}
+}
+
+// CHECK: fix-it:"{{.*}}":{201:3-203:34}:"false"
+// CHECK: fix-it:"{{.*}}":{200:8-200:8}:" = 0"
+
+
+int test_logical_or_false(int k) {
+ int x; // expected-note {{variable}}
+ maybe() // expected-warning {{whenever '||' condition is false}} \
+ // expected-note {{remove the '||' if its condition is always true}}
+ || ({ goto skip_init; 0; });
+ x = 1;
+skip_init:
+ return x; // expected-note {{uninitialized use}}
+}
+
+// CHECK: fix-it:"{{.*}}":{215:3-217:34}:"true"
+// CHECK: fix-it:"{{.*}}":{214:8-214:8}:" = 0"
+
+
+int test_logical_or_true(int k) {
+ int x; // expected-note {{variable}}
+ maybe() // expected-warning {{whenever '||' condition is true}} \
+ // expected-note {{remove the '||' if its condition is always false}}
+ || (x = 1);
+ return x; // expected-note {{uninitialized use}}
+}
+
+// CHECK: fix-it:"{{.*}}":{229:3-231:9}:""
+// CHECK: fix-it:"{{.*}}":{228:8-228:8}:" = 0"
+
+
+int test_switch_case(int k) {
+ int x; // expected-note {{variable}}
+ switch (k) {
+ case 0:
+ x = 0;
+ break;
+ case 1: // expected-warning {{whenever switch case is taken}}
+ break;
+ }
+ return x; // expected-note {{uninitialized use}}
+}
+
+// CHECK: fix-it:"{{.*}}":{240:8-240:8}:" = 0"
+
+
+
+int test_switch_default(int k) {
+ int x; // expected-note {{variable}}
+ switch (k) {
+ case 0:
+ x = 0;
+ break;
+ case 1:
+ x = 1;
+ break;
+ default: // expected-warning {{whenever switch default is taken}}
+ break;
+ }
+ return x; // expected-note {{uninitialized use}}
+}
+
+// CHECK: fix-it:"{{.*}}":{256:8-256:8}:" = 0"
+
+
+
+int test_switch_suppress_1(int k) {
+ int x;
+ switch (k) {
+ case 0:
+ x = 0;
+ break;
+ case 1:
+ x = 1;
+ break;
+ }
+ return x; // no-warning
+}
+
+
+
+
+
+int test_switch_suppress_2(int k) {
+ int x;
+ switch (k) {
+ case 0:
+ case 1:
+ switch (k) {
+ case 0:
+ return 0;
+ case 1:
+ return 1;
+ }
+ case 2:
+ case 3:
+ x = 1;
+ }
+ return x; // no-warning
+}
+
+
+
+
+
+int test_multiple_notes(int k) {
+ int x; // expected-note {{variable}}
+ if (k > 0) {
+ if (k == 5)
+ x = 1;
+ else if (k == 2) // expected-warning {{whenever 'if' condition is false}} \
+ // expected-note {{remove the 'if' if its condition is always true}}
+ x = 2;
+ } else {
+ if (k == -5)
+ x = 3;
+ else if (k == -2) // expected-warning {{whenever 'if' condition is false}} \
+ // expected-note {{remove the 'if' if its condition is always true}}
+ x = 4;
+ }
+ return x; // expected-note 2{{uninitialized use}}
+}
+
+// CHECK: fix-it:"{{.*}}":{324:10-326:7}:""
+// CHECK: fix-it:"{{.*}}":{318:10-320:7}:""
+// CHECK: fix-it:"{{.*}}":{314:8-314:8}:" = 0"
+
+int test_no_false_positive_1(int k) {
+ int x;
+ if (k)
+ x = 5;
+ while (!k)
+ maybe();
+ return x;
+}
+
+
+
+
+
+int test_no_false_positive_2() {
+ int x;
+ bool b = false;
+ if (maybe()) {
+ x = 5;
+ b = true;
+ }
+ return b ? x : 0;
+}
+
+
+// FIXME: In this case, the variable is used uninitialized whenever the
+// function's entry block is reached. Produce a diagnostic saying that
+// the variable is uninitialized the first time it is used.
+void test_null_pred_succ() {
+ int x;
+ if (0)
+ foo: x = 0;
+ if (x)
+ goto foo;
+}
+
+
+
+
+void foo();
+int PR13360(bool b) {
+ int x; // expected-note {{variable}}
+ if (b) { // expected-warning {{variable 'x' is used uninitialized whenever 'if' condition is true}} expected-note {{remove}}
+ do {
+ foo();
+ } while (0);
+ } else {
+ x = 1;
+ }
+ return x; // expected-note {{uninitialized use occurs here}}
+}
+
+// CHECK: fix-it:"{{.*}}":{376:3-380:10}:""
+// CHECK: fix-it:"{{.*}}":{375:8-375:8}:" = 0"