]> granicus.if.org Git - clang/commitdiff
Implemented transfer function logic for unary '+'
authorTed Kremenek <kremenek@apple.com>
Wed, 20 Feb 2008 04:12:31 +0000 (04:12 +0000)
committerTed Kremenek <kremenek@apple.com>
Wed, 20 Feb 2008 04:12:31 +0000 (04:12 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47357 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 243c0788769776e300361e59c5d0473e65cdf658..75ced576f44447f398188472541f2f24b58da59e 100644 (file)
@@ -670,6 +670,12 @@ void GRExprEngine::VisitUnaryOperator(UnaryOperator* U,
         break;
       }
         
+      case UnaryOperator::Plus: {
+        const NonLValue& R1 = cast<NonLValue>(GetValue(St, U->getSubExpr()));
+        Nodify(Dst, U, N1, SetValue(St, U, EvalPlus(ValMgr, U, R1)));
+        break;
+      }
+        
       case UnaryOperator::Not: {
         const NonLValue& R1 = cast<NonLValue>(GetValue(St, U->getSubExpr()));
         Nodify(Dst, U, N1, SetValue(St, U, EvalComplement(ValMgr, R1)));
index 443a7ddb7599dd4c5bfda4e928dd3076bc3f897e..a76acb3d1f366030281c602eed2fac135221434c 100644 (file)
@@ -112,6 +112,20 @@ NonLValue GRSimpleVals::EvalMinus(ValueManager& ValMgr, UnaryOperator* U,
   }
 }
 
+NonLValue GRSimpleVals::EvalPlus(ValueManager& ValMgr, UnaryOperator* U,
+                                 NonLValue X) {
+  
+  assert (!isa<UnknownVal>(X) && !isa<UninitializedVal>(X));
+  
+  switch (X.getSubKind()) {
+    case nonlval::ConcreteIntKind:
+      return cast<nonlval::ConcreteInt>(X).EvalPlus(ValMgr, U);
+    default:
+      return cast<NonLValue>(UnknownVal());
+  }
+}
+
+
 NonLValue GRSimpleVals::EvalComplement(ValueManager& ValMgr, NonLValue X) {
 
   assert (!isa<UnknownVal>(X) && !isa<UninitializedVal>(X));
index 34b1d4f183cf66d24e9b00f62c2a9f5eda85d9ee..3a73e41033ddfce188cdbc1b900fa0563be11677 100644 (file)
@@ -36,6 +36,9 @@ public:
   virtual NonLValue EvalMinus(ValueManager& ValMgr, UnaryOperator* U,
                               NonLValue X);
   
+  virtual NonLValue EvalPlus(ValueManager& ValMgr, UnaryOperator* U,
+                             NonLValue X);
+  
   virtual NonLValue EvalComplement(ValueManager& ValMgr, NonLValue X);
   
   // Binary Operators.
index 60277300718966d787dbb82475b733524f894033..c4041b866db4fb44466243f6d826cfef0400d959 100644 (file)
@@ -77,6 +77,13 @@ nonlval::ConcreteInt::EvalMinus(ValueManager& ValMgr, UnaryOperator* U) const {
   return ValMgr.getValue(-getValue()); 
 }
 
+nonlval::ConcreteInt
+nonlval::ConcreteInt::EvalPlus(ValueManager& ValMgr, UnaryOperator* U) const {
+  assert (U->getType() == U->getSubExpr()->getType());  
+  assert (U->getType()->isIntegerType());  
+  return ValMgr.getValue(getValue()); 
+}
+
 //===----------------------------------------------------------------------===//
 // Transfer function dispatch for LValues.
 //===----------------------------------------------------------------------===//
index 5ae8012c07f74f79f23fb75d2dbcb7a669dd71bc..9220238ca0de6ad59ffe0c14b0f6d6887ae6e99c 100644 (file)
@@ -347,6 +347,14 @@ public:
     return TF->EvalMinus(ValMgr, U, X);    
   }
   
+  inline NonLValue EvalPlus(ValueManager& ValMgr, UnaryOperator* U,
+                             NonLValue X) {
+    if (isa<UnknownVal>(X) || isa<UninitializedVal>(X))
+      return X;    
+    
+    return TF->EvalPlus(ValMgr, U, X);    
+  }
+  
   inline NonLValue EvalComplement(ValueManager& ValMgr, NonLValue X) {
     if (isa<UnknownVal>(X) || isa<UninitializedVal>(X))
       return X;    
index 53491d532e5e46b6fa77a6990339ed8ae8132ee2..8aca43a89e2fc5f2159025b6a4fe054882c5237b 100644 (file)
@@ -35,6 +35,9 @@ public:
   virtual NonLValue EvalMinus(ValueManager& ValMgr, UnaryOperator* U,
                               NonLValue X) = 0;
 
+  virtual NonLValue EvalPlus(ValueManager& ValMgr, UnaryOperator* U,
+                             NonLValue X) = 0;
+  
   virtual NonLValue EvalComplement(ValueManager& ValMgr, NonLValue X) = 0;
 
   // Binary Operators.
index 8c3b8197f321d82bf0cfe4b8bf34d67cfc1dce82..beeb1c8216628b7e626d1c7df425d1595c2640ae 100644 (file)
@@ -198,6 +198,7 @@ namespace nonlval {
     
     ConcreteInt EvalComplement(ValueManager& ValMgr) const;
     ConcreteInt EvalMinus(ValueManager& ValMgr, UnaryOperator* U) const;
+    ConcreteInt EvalPlus(ValueManager& ValMgr, UnaryOperator* U) const;
     
     // Implement isa<T> support.
     static inline bool classof(const RValue* V) {