diff options
-rw-r--r-- | lib/Analysis/GRExprEngine.cpp | 6 | ||||
-rw-r--r-- | test/Analysis/misc-ps-region-store.cpp | 15 |
2 files changed, 21 insertions, 0 deletions
diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp index d7486f8513..06621af19e 100644 --- a/lib/Analysis/GRExprEngine.cpp +++ b/lib/Analysis/GRExprEngine.cpp @@ -751,6 +751,12 @@ void GRExprEngine::Visit(Stmt* S, ExplodedNode* Pred, ExplodedNodeSet& Dst) { VisitUnaryOperator(U, Pred, Dst, false); break; } + + case Stmt::WhileStmtClass: + // This case isn't for branch processing, but for handling the + // initialization of a condition variable. + VisitCondInit(cast<WhileStmt>(S)->getConditionVariable(), S, Pred, Dst); + break; } } diff --git a/test/Analysis/misc-ps-region-store.cpp b/test/Analysis/misc-ps-region-store.cpp index e9d6d93871..fcef0516ec 100644 --- a/test/Analysis/misc-ps-region-store.cpp +++ b/test/Analysis/misc-ps-region-store.cpp @@ -59,3 +59,18 @@ int test_init_in_condition_switch() { } return 0; } + +int test_init_in_condition_while() { + int y = 1; + while (int x = test_init_in_condition_aux()) { // no-warning + if (!x) { + y = 0; + break; + } + } + if (!y) { + int *p = 0; + *p = 0xDEADBEEF; // no-warning + } + return 0; +} |