From 6217dffec367de7fcdb01cf055c1b2b8d9583ee5 Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Tue, 26 Feb 2008 23:37:01 +0000 Subject: Fix bug when processing '?' operator: invalidate the old "Uninitialized" value of the block-level expression for ?. llvm-svn: 47645 --- clang/Analysis/ValueState.cpp | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) (limited to 'clang/Analysis/ValueState.cpp') diff --git a/clang/Analysis/ValueState.cpp b/clang/Analysis/ValueState.cpp index 7be59ce5f5f..97a090dad70 100644 --- a/clang/Analysis/ValueState.cpp +++ b/clang/Analysis/ValueState.cpp @@ -387,12 +387,27 @@ RVal ValueStateManager::GetLVal(ValueState St, Expr* E) { } ValueState -ValueStateManager::SetRVal(ValueState St, Expr* E, bool isBlkExpr, RVal V) { +ValueStateManager::SetRVal(ValueState St, Expr* E, RVal V, + bool isBlkExpr, bool Invalidate) { assert (E); - if (V.isUnknown()) + if (V.isUnknown()) { + + if (Invalidate) { + + ValueStateImpl NewSt = *St; + + if (isBlkExpr) + NewSt.BlockExprBindings = EXFactory.Remove(NewSt.BlockExprBindings, E); + else + NewSt.SubExprBindings = EXFactory.Remove(NewSt.SubExprBindings, E); + + return getPersistentState(NewSt); + } + return St; + } ValueStateImpl NewSt = *St; @@ -406,8 +421,8 @@ ValueStateManager::SetRVal(ValueState St, Expr* E, bool isBlkExpr, RVal V) { return getPersistentState(NewSt); } -ValueState -ValueStateManager::SetRVal(ValueState St, LVal LV, RVal V) { + +ValueState ValueStateManager::SetRVal(ValueState St, LVal LV, RVal V) { switch (LV.getSubKind()) { -- cgit v1.2.3