]> granicus.if.org Git - clang/commitdiff
Implemented transfer function for unary '~'.
authorTed Kremenek <kremenek@apple.com>
Mon, 4 Feb 2008 16:58:30 +0000 (16:58 +0000)
committerTed Kremenek <kremenek@apple.com>
Mon, 4 Feb 2008 16:58:30 +0000 (16:58 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46708 91177308-0d34-0410-b5e6-96231b3b80d8

Analysis/GRConstants.cpp
Analysis/RValues.cpp
Analysis/RValues.h

index 895f0e1025ccd34640ee0dcd19756dc9cec4513b..cc999b9349ccb427eb51c5aac70ca543a8318414 100644 (file)
@@ -561,6 +561,12 @@ void GRConstants::VisitUnaryOperator(UnaryOperator* U,
         break;
       }
         
+      case UnaryOperator::Not: {
+        const NonLValue& R1 = cast<NonLValue>(GetValue(St, U->getSubExpr()));
+        Nodify(Dst, U, N1, SetValue(St, U, R1.BitwiseComplement(ValMgr)));
+        break;
+      }
+        
       case UnaryOperator::AddrOf: {
         const LValue& L1 = GetLValue(St, U->getSubExpr());
         Nodify(Dst, U, N1, SetValue(St, U, L1));
index f41051ed57c86c88b37ef61bce856fe82031532c..2854ee641447bcd1be90d98317bc873d98631ab2 100644 (file)
@@ -138,6 +138,16 @@ NonLValue NonLValue::UnaryMinus(ValueManager& ValMgr, UnaryOperator* U) const {
   }
 }
 
+NonLValue NonLValue::BitwiseComplement(ValueManager& ValMgr) const {
+  switch (getSubKind()) {
+    case ConcreteIntKind:
+      return cast<ConcreteInt>(this)->BitwiseComplement(ValMgr);
+    default:
+      return cast<NonLValue>(InvalidValue());
+  }
+}
+
+
 #define NONLVALUE_DISPATCH_CASE(k1,k2,Op)\
 case (k1##Kind*NumNonLValueKind+k2##Kind):\
 return cast<k1>(*this).Op(ValMgr,cast<k2>(RHS));
index c5ad8a5327e7500cba53713126145f775bc870e7..79202da545ac3a5764e80f38535d72c854c17d57 100644 (file)
@@ -196,6 +196,7 @@ public:
   NonLValue Div(ValueManager& ValMgr, const NonLValue& RHS) const;
   NonLValue Rem(ValueManager& ValMgr, const NonLValue& RHS) const;
   NonLValue UnaryMinus(ValueManager& ValMgr, UnaryOperator* U) const;
+  NonLValue BitwiseComplement(ValueManager& ValMgr) const;
   
   // Equality operators.
   NonLValue EQ(ValueManager& ValMgr, const NonLValue& RHS) const;
@@ -295,6 +296,10 @@ public:
     return ValMgr.getValue(-getValue()); 
   }
   
+  ConcreteInt BitwiseComplement(ValueManager& ValMgr) const {
+    return ValMgr.getValue(~getValue()); 
+  }
+  
   // Casting.
   
   ConcreteInt Cast(ValueManager& ValMgr, Expr* CastExpr) const {