From: Ted Kremenek Date: Wed, 6 Feb 2008 17:56:00 +0000 (+0000) Subject: Added main transfer function support for unary operator "!". X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c60f0f79c962e1e91538546173d7f5ede1f5a89c;p=clang Added main transfer function support for unary operator "!". git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46815 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Analysis/GRConstants.cpp b/Analysis/GRConstants.cpp index a9371ee4e6..2b44bf7df6 100644 --- a/Analysis/GRConstants.cpp +++ b/Analysis/GRConstants.cpp @@ -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(V1)) { + lval::ConcreteInt V2(ValMgr.getValue(0, U->getSubExpr()->getType())); + Nodify(Dst, U, N1, SetValue(St, U, + cast(V1).EQ(ValMgr, V2))); + } + else { + nonlval::ConcreteInt V2(ValMgr.getZeroWithPtrWidth()); + Nodify(Dst, U, N1, SetValue(St, U, + cast(V1).EQ(ValMgr, V2))); + } + + break; + } + case UnaryOperator::AddrOf: { const LValue& L1 = GetLValue(St, U->getSubExpr()); Nodify(Dst, U, N1, SetValue(St, U, L1));