]> granicus.if.org Git - clang/commitdiff
Migrated transfer functions for unary "~" and "-" to GRTransferFuncs/GRSimpleVals.
authorTed Kremenek <kremenek@apple.com>
Thu, 14 Feb 2008 18:40:24 +0000 (18:40 +0000)
committerTed Kremenek <kremenek@apple.com>
Thu, 14 Feb 2008 18:40:24 +0000 (18:40 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47126 91177308-0d34-0410-b5e6-96231b3b80d8

Analysis/GRExprEngine.cpp
Analysis/GRSimpleVals.cpp
Analysis/GRSimpleVals.h
Analysis/RValues.cpp
include/clang/Analysis/PathSensitive/GRTransferFuncs.h
include/clang/Analysis/PathSensitive/RValues.h

index 3ff4c4bdfe0deda09ad6d85c4cf6e64c9af75aa8..9ec43d911c391d47872b1f40cff8830d35040e27 100644 (file)
@@ -325,6 +325,14 @@ public:
     return TF.EvalCast(ValMgr, R, CastExpr);
   }
   
+  inline NonLValue EvalMinus(ValueManager& ValMgr, UnaryOperator* U,
+                              NonLValue X) {
+    return TF.EvalMinus(ValMgr, U, X);    
+  }
+  
+  inline NonLValue EvalComplement(ValueManager& ValMgr, NonLValue X) {
+    return TF.EvalComplement(ValMgr, X);
+  }
 };
 } // end anonymous namespace
 
@@ -839,13 +847,13 @@ void GRExprEngine::VisitUnaryOperator(UnaryOperator* U,
         
       case UnaryOperator::Minus: {
         const NonLValue& R1 = cast<NonLValue>(GetValue(St, U->getSubExpr()));
-        Nodify(Dst, U, N1, SetValue(St, U, R1.EvalMinus(ValMgr, U)));
+        Nodify(Dst, U, N1, SetValue(St, U, EvalMinus(ValMgr, U, R1)));
         break;
       }
         
       case UnaryOperator::Not: {
         const NonLValue& R1 = cast<NonLValue>(GetValue(St, U->getSubExpr()));
-        Nodify(Dst, U, N1, SetValue(St, U, R1.EvalComplement(ValMgr)));
+        Nodify(Dst, U, N1, SetValue(St, U, EvalComplement(ValMgr, R1)));
         break;
       }
         
index 447eb44f0e2b96d8f1cd2ae67bead48e48e243e9..a2711c73b43e3db7bdc5865f51134db3cfcb80d6 100644 (file)
@@ -56,4 +56,26 @@ RValue GRSimpleVals::EvalCast(ValueManager& ValMgr, LValue X, Expr* CastExpr) {
   V.extOrTrunc(ValMgr.getContext().getTypeSize(T, CastExpr->getLocStart()));
 
   return nonlval::ConcreteInt(ValMgr.getValue(V));
-}
\ No newline at end of file
+}
+
+// Unary operators.
+
+NonLValue GRSimpleVals::EvalMinus(ValueManager& ValMgr, UnaryOperator* U,
+                                  NonLValue X) {
+  
+  switch (X.getSubKind()) {
+    case nonlval::ConcreteIntKind:
+      return cast<nonlval::ConcreteInt>(X).EvalMinus(ValMgr, U);
+    default:
+      return cast<NonLValue>(UnknownVal());
+  }
+}
+
+NonLValue GRSimpleVals::EvalComplement(ValueManager& ValMgr, NonLValue X) {
+  switch (X.getSubKind()) {
+    case nonlval::ConcreteIntKind:
+      return cast<nonlval::ConcreteInt>(X).EvalComplement(ValMgr);
+    default:
+      return cast<NonLValue>(UnknownVal());
+  }
+}
index 4c9c6890baa3c2f95482957d646044364f58bb8d..373be305eaa55823f09e1f173e1e781210dea83d 100644 (file)
@@ -25,8 +25,17 @@ public:
   GRSimpleVals() {}
   virtual ~GRSimpleVals() {}
   
+  // Casts.
+  
   virtual RValue EvalCast(ValueManager& ValMgr, NonLValue V, Expr* CastExpr);
   virtual RValue EvalCast(ValueManager& ValMgr, LValue V, Expr* CastExpr);
+  
+  // Unary Operators.
+  
+  virtual NonLValue EvalMinus(ValueManager& ValMgr, UnaryOperator* U,
+                              NonLValue X);
+  
+  virtual NonLValue EvalComplement(ValueManager& ValMgr, NonLValue X);
 };
   
   
index 06d29550a10dab6541e9d735387b918f1bec37fd..17425aff5a15f914724c4a28d64d07605482a988 100644 (file)
@@ -243,14 +243,6 @@ nonlval::ConcreteInt::EvalBinaryOp(ValueManager& ValMgr,
 
   // Bitwise-Complement.
 
-NonLValue NonLValue::EvalComplement(ValueManager& ValMgr) const {
-  switch (getSubKind()) {
-    case nonlval::ConcreteIntKind:
-      return cast<nonlval::ConcreteInt>(this)->EvalComplement(ValMgr);
-    default:
-      return cast<NonLValue>(UnknownVal());
-  }
-}
 
 nonlval::ConcreteInt
 nonlval::ConcreteInt::EvalComplement(ValueManager& ValMgr) const {
@@ -259,15 +251,6 @@ nonlval::ConcreteInt::EvalComplement(ValueManager& ValMgr) const {
 
   // Unary Minus.
 
-NonLValue NonLValue::EvalMinus(ValueManager& ValMgr, UnaryOperator* U) const {
-  switch (getSubKind()) {
-    case nonlval::ConcreteIntKind:
-      return cast<nonlval::ConcreteInt>(this)->EvalMinus(ValMgr, U);
-    default:
-      return cast<NonLValue>(UnknownVal());
-  }
-}
-
 nonlval::ConcreteInt
 nonlval::ConcreteInt::EvalMinus(ValueManager& ValMgr, UnaryOperator* U) const {
   assert (U->getType() == U->getSubExpr()->getType());  
index 7e8b38d86c0127eeb483702d7c2e375af758109d..54f118bf80c2f8b43c1546005b9d3d655c3830a8 100644 (file)
@@ -24,11 +24,19 @@ public:
   GRTransferFuncs() {}
   virtual ~GRTransferFuncs() {}
   
+  // Casts.
+  
   RValue EvalCast(ValueManager& ValMgr, RValue V, Expr* CastExpr);
   virtual RValue EvalCast(ValueManager& ValMgr, NonLValue V, Expr* CastExpr) =0;
   virtual RValue EvalCast(ValueManager& ValMgr, LValue V, Expr* CastExpr) = 0;
 
+  // Unary Operators.
   
+  virtual NonLValue EvalMinus(ValueManager& ValMgr, UnaryOperator* U,
+                              NonLValue X) = 0;
+
+  virtual NonLValue EvalComplement(ValueManager& ValMgr, NonLValue X) = 0;
+
   
 };
   
index 8d84498a0b8b1384a13cb0f97f69396765476c2d..d3b958366f58e27a9947981fa0f798d8df07e069 100644 (file)
@@ -325,9 +325,6 @@ public:
   NonLValue EvalBinaryOp(ValueManager& ValMgr,
                                BinaryOperator::Opcode Op,
                                const NonLValue& RHS) const;
-
-  NonLValue EvalMinus(ValueManager& ValMgr, UnaryOperator* U) const;
-  NonLValue EvalComplement(ValueManager& ValMgr) const;
   
   // Utility methods to create NonLValues.
   static NonLValue GetValue(ValueManager& ValMgr, uint64_t X, QualType T,