]> granicus.if.org Git - clang/commitdiff
Fix regression by explicitly checking if we are negating a SymIntConstantVal.
authorTed Kremenek <kremenek@apple.com>
Fri, 18 Jul 2008 15:54:51 +0000 (15:54 +0000)
committerTed Kremenek <kremenek@apple.com>
Fri, 18 Jul 2008 15:54:51 +0000 (15:54 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@53753 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Analysis/PathSensitive/RValues.h
lib/Analysis/GRSimpleVals.cpp
lib/Analysis/RValues.cpp

index 5a010dd0dc8083380f5e55583d3bc443bc61ae01..884f467aef4f05a21b22381dabc2d69059275be9 100644 (file)
@@ -83,6 +83,8 @@ public:
     return getRawKind() > UnknownKind;
   }
   
+  bool isZeroConstant() const;
+  
   void print(std::ostream& OS) const;
   void printStdErr() const;
   
index 6cb714a86e1ca861218772154d1b4998bbdffff6..36e7233f25fc2e0e312e75082db613fc8047feeb 100644 (file)
@@ -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<nonlval::SymIntConstraintVal>(L).getConstraint();
         
         BinaryOperator::Opcode Opc = C.getOpcode();
-
+        
         if (Opc < BinaryOperator::LT || Opc > BinaryOperator::NE)
           return UnknownVal();
 
index 60c349420a3d570649de659e72617203209f0c41..ed3dba925ebe73c06cc5b9aef047d42f89afe9b9 100644 (file)
@@ -54,6 +54,20 @@ RVal::symbol_iterator RVal::symbol_end() const {
   return X ? X+1 : NULL;
 }
 
+//===----------------------------------------------------------------------===//
+// Useful predicates.
+//===----------------------------------------------------------------------===//
+
+bool RVal::isZeroConstant() const {
+  if (isa<lval::ConcreteInt>(*this))
+    return cast<lval::ConcreteInt>(*this).getValue() == 0;
+  else if (isa<nonlval::ConcreteInt>(*this))
+    return cast<nonlval::ConcreteInt>(*this).getValue() == 0;
+  else
+    return false;
+}
+
+
 //===----------------------------------------------------------------------===//
 // Transfer function dispatch for Non-LVals.
 //===----------------------------------------------------------------------===//