Fix bug when processing '?' operator: invalidate the old "Uninitialized" value of the block-level expression for ?.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47645 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Analysis/GRExprEngine.cpp b/Analysis/GRExprEngine.cpp
index 674454c..c911064 100644
--- a/Analysis/GRExprEngine.cpp
+++ b/Analysis/GRExprEngine.cpp
@@ -40,7 +40,7 @@
       return St;
   }
 
-  return StateMgr.SetRVal(St, Ex, isBlkExpr, V);
+  return StateMgr.SetRVal(St, Ex, V, isBlkExpr, false);
 }
 
 const GRExprEngine::StateTy::BufferTy&
@@ -606,7 +606,9 @@
   assert (SE);
     
   X = GetBlkExprRVal(St, SE);
-  Nodify(Dst, Ex, Pred, SetBlkExprRVal(St, Ex, X));
+  
+  // Make sure that we invalidate the previous binding.
+  Nodify(Dst, Ex, Pred, StateMgr.SetRVal(St, Ex, X, true, true));
 }
 
 /// VisitSizeOfAlignOfTypeExpr - Transfer function for sizeof(type).
diff --git a/Analysis/ValueState.cpp b/Analysis/ValueState.cpp
index 7be59ce..97a090d 100644
--- a/Analysis/ValueState.cpp
+++ b/Analysis/ValueState.cpp
@@ -387,12 +387,27 @@
 }
 
 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 @@
   return getPersistentState(NewSt);
 }
 
-ValueState
-ValueStateManager::SetRVal(ValueState St, LVal LV, RVal V) {
+
+ValueState ValueStateManager::SetRVal(ValueState St, LVal LV, RVal V) {
   
   switch (LV.getSubKind()) {
       
diff --git a/Analysis/ValueState.h b/Analysis/ValueState.h
index 3e00122..5458ab8 100644
--- a/Analysis/ValueState.h
+++ b/Analysis/ValueState.h
@@ -255,7 +255,9 @@
     return getPersistentState(NewSt);    
   }
   
-  ValueState SetRVal(ValueState St, Expr* E, bool isBlkExpr, RVal V);
+  ValueState SetRVal(ValueState St, Expr* E, RVal V,
+                     bool isBlkExpr, bool Invalidate);
+  
   ValueState SetRVal(ValueState St, LVal LV, RVal V);
 
   RVal GetRVal(ValueState St, Expr* E);