]> granicus.if.org Git - clang/commitdiff
More fixes in cast logic.
authorTed Kremenek <kremenek@apple.com>
Thu, 5 Mar 2009 03:42:31 +0000 (03:42 +0000)
committerTed Kremenek <kremenek@apple.com>
Thu, 5 Mar 2009 03:42:31 +0000 (03:42 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66130 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/GRExprEngine.cpp

index 24250166c2edabfe103a91db15869f361b284610..89ae70c090130ee6680ffb96f529e8079b5e2b9d 100644 (file)
@@ -1719,18 +1719,12 @@ void GRExprEngine::VisitCastPointerToInteger(SVal V, const GRState* state,
   if (!V.isUnknownOrUndef()) {
     // FIXME: Determine if the number of bits of the target type is 
     // equal or exceeds the number of bits to store the pointer value.
-    // If not, flag an error.
-    
-    if (loc::ConcreteInt *CI = dyn_cast<loc::ConcreteInt>(&V)) {
-      V = nonloc::ConcreteInt(CI->getValue());
-    }
-    else {    
-      unsigned bits = getContext().getTypeSize(PtrTy);  
-      V = nonloc::LocAsInteger::Make(getBasicVals(), cast<Loc>(V), bits);
-    }
+    // If not, flag an error.    
+    MakeNode(Dst, CastE, Pred, BindExpr(state, CastE,
+                                        EvalCast(V, CastE->getType())));
   }
-  
-  MakeNode(Dst, CastE, Pred, BindExpr(state, CastE, V));
+  else  
+    MakeNode(Dst, CastE, Pred, BindExpr(state, CastE, V));
 }
 
   
@@ -1798,10 +1792,9 @@ void GRExprEngine::VisitCast(Expr* CastE, Expr* Ex, NodeTy* Pred, NodeSet& Dst){
         V = LV->getLoc();
         MakeNode(Dst, CastE, N, BindExpr(state, CastE, V));
       }
-      else if (nonloc::ConcreteInt *CI = dyn_cast<nonloc::ConcreteInt>(&V)) {
-        MakeNode(Dst, CastE, N,
-                 BindExpr(state, CastE, loc::ConcreteInt(CI->getValue())));
-      }
+      
+      MakeNode(Dst, CastE, N, BindExpr(state, CastE,
+                                       EvalCast(V, CastE->getType())));
       
       continue;      
     }
@@ -2729,7 +2722,7 @@ void GRExprEngine::VisitBinaryOperator(BinaryOperator* B,
         // Evaluate operands and promote to result type.                    
         if (RightV.isUndef()) {            
           // Propagate undefined values (right-side).          
-          EvalStore(Dst,B, LHS, *I3, BindExpr(state, B, RightV), location,
+          EvalStore(Dst, B, LHS, *I3, BindExpr(state, B, RightV), location,
                     RightV);
           continue;
         }