PR13360: When deciding the earliest point which inevitably leads to an
uninitialized variable use, walk back over branches where we've reached all the
non-null successors, not just cases where we've reached all successors.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@160206 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/test/Analysis/uninit-sometimes.cpp b/test/Analysis/uninit-sometimes.cpp
index 9667e2a..7825e87 100644
--- a/test/Analysis/uninit-sometimes.cpp
+++ b/test/Analysis/uninit-sometimes.cpp
@@ -356,16 +356,32 @@
}
-
-
-
+// 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; // expected-note {{variable}}
- if (0) // expected-warning {{whenever}} expected-note {{remove}}
+ int x;
+ if (0)
foo: x = 0;
- if (x) // expected-note {{uninitialized use}}
+ if (x)
goto foo;
}
-// CHECK: fix-it:"{{.*}}":{364:3-365:5}:""
-// CHECK: fix-it:"{{.*}}":{363:8-363:8}:" = 0"
+
+
+
+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"