From: Ted Kremenek Date: Mon, 4 Feb 2008 16:58:30 +0000 (+0000) Subject: Implemented transfer function for unary '~'. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c5d3b4ca4707b1fe69629bfefd73087dc4893dd8;p=clang Implemented transfer function for unary '~'. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46708 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Analysis/GRConstants.cpp b/Analysis/GRConstants.cpp index 895f0e1025..cc999b9349 100644 --- a/Analysis/GRConstants.cpp +++ b/Analysis/GRConstants.cpp @@ -561,6 +561,12 @@ void GRConstants::VisitUnaryOperator(UnaryOperator* U, break; } + case UnaryOperator::Not: { + const NonLValue& R1 = cast(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)); diff --git a/Analysis/RValues.cpp b/Analysis/RValues.cpp index f41051ed57..2854ee6414 100644 --- a/Analysis/RValues.cpp +++ b/Analysis/RValues.cpp @@ -138,6 +138,16 @@ NonLValue NonLValue::UnaryMinus(ValueManager& ValMgr, UnaryOperator* U) const { } } +NonLValue NonLValue::BitwiseComplement(ValueManager& ValMgr) const { + switch (getSubKind()) { + case ConcreteIntKind: + return cast(this)->BitwiseComplement(ValMgr); + default: + return cast(InvalidValue()); + } +} + + #define NONLVALUE_DISPATCH_CASE(k1,k2,Op)\ case (k1##Kind*NumNonLValueKind+k2##Kind):\ return cast(*this).Op(ValMgr,cast(RHS)); diff --git a/Analysis/RValues.h b/Analysis/RValues.h index c5ad8a5327..79202da545 100644 --- a/Analysis/RValues.h +++ b/Analysis/RValues.h @@ -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 {