From: Ted Kremenek Date: Fri, 18 Jul 2008 15:54:51 +0000 (+0000) Subject: Fix regression by explicitly checking if we are negating a SymIntConstantVal. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=40fc5c7e235965af368a34cdbb6d32827cd1e1d8;p=clang Fix regression by explicitly checking if we are negating a SymIntConstantVal. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@53753 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Analysis/PathSensitive/RValues.h b/include/clang/Analysis/PathSensitive/RValues.h index 5a010dd0dc..884f467aef 100644 --- a/include/clang/Analysis/PathSensitive/RValues.h +++ b/include/clang/Analysis/PathSensitive/RValues.h @@ -83,6 +83,8 @@ public: return getRawKind() > UnknownKind; } + bool isZeroConstant() const; + void print(std::ostream& OS) const; void printStdErr() const; diff --git a/lib/Analysis/GRSimpleVals.cpp b/lib/Analysis/GRSimpleVals.cpp index 6cb714a86e..36e7233f25 100644 --- a/lib/Analysis/GRSimpleVals.cpp +++ b/lib/Analysis/GRSimpleVals.cpp @@ -472,11 +472,16 @@ RVal GRSimpleVals::DetermEvalBinOpNN(ValueStateManager& StateMgr, return UnknownVal(); case nonlval::SymIntConstraintValKind: { + + // Logical not? + if (!(Op == BinaryOperator::EQ && R.isZeroConstant())) + return UnknownVal(); + const SymIntConstraint& C = cast(L).getConstraint(); BinaryOperator::Opcode Opc = C.getOpcode(); - + if (Opc < BinaryOperator::LT || Opc > BinaryOperator::NE) return UnknownVal(); diff --git a/lib/Analysis/RValues.cpp b/lib/Analysis/RValues.cpp index 60c349420a..ed3dba925e 100644 --- a/lib/Analysis/RValues.cpp +++ b/lib/Analysis/RValues.cpp @@ -54,6 +54,20 @@ RVal::symbol_iterator RVal::symbol_end() const { return X ? X+1 : NULL; } +//===----------------------------------------------------------------------===// +// Useful predicates. +//===----------------------------------------------------------------------===// + +bool RVal::isZeroConstant() const { + if (isa(*this)) + return cast(*this).getValue() == 0; + else if (isa(*this)) + return cast(*this).getValue() == 0; + else + return false; +} + + //===----------------------------------------------------------------------===// // Transfer function dispatch for Non-LVals. //===----------------------------------------------------------------------===//