]> granicus.if.org Git - clang/commitdiff
Added main transfer function support for unary operator "!".
authorTed Kremenek <kremenek@apple.com>
Wed, 6 Feb 2008 17:56:00 +0000 (17:56 +0000)
committerTed Kremenek <kremenek@apple.com>
Wed, 6 Feb 2008 17:56:00 +0000 (17:56 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46815 91177308-0d34-0410-b5e6-96231b3b80d8

Analysis/GRConstants.cpp

index a9371ee4e6b4073d5606284d8d4e73fec0ce46cc..2b44bf7df6ac91a77988f9a6eb6806bca53039ea 100644 (file)
@@ -626,6 +626,28 @@ void GRConstants::VisitUnaryOperator(UnaryOperator* U,
         break;
       }
         
+      case UnaryOperator::LNot: {
+        // C99 6.5.3.3: "The expression !E is equivalent to (0==E)."
+        //
+        //  Note: technically we do "E == 0", but this is the same in the
+        //    transfer functions as "0 == E".
+        
+        RValue V1 = GetValue(St, U->getSubExpr());
+        
+        if (isa<LValue>(V1)) {
+          lval::ConcreteInt V2(ValMgr.getValue(0, U->getSubExpr()->getType()));
+          Nodify(Dst, U, N1, SetValue(St, U,
+                                      cast<LValue>(V1).EQ(ValMgr, V2)));
+        }
+        else {
+          nonlval::ConcreteInt V2(ValMgr.getZeroWithPtrWidth());
+          Nodify(Dst, U, N1, SetValue(St, U,
+                                      cast<NonLValue>(V1).EQ(ValMgr, V2)));
+        }
+        
+        break;
+      }
+        
       case UnaryOperator::AddrOf: {
         const LValue& L1 = GetLValue(St, U->getSubExpr());
         Nodify(Dst, U, N1, SetValue(St, U, L1));