Implicitly compare symbolic expressions to zero when they're being used as constraints. Part of PR7491.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@106972 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Checker/SimpleConstraintManager.cpp b/lib/Checker/SimpleConstraintManager.cpp
index a1594a9..321381b 100644
--- a/lib/Checker/SimpleConstraintManager.cpp
+++ b/lib/Checker/SimpleConstraintManager.cpp
@@ -174,9 +174,13 @@
       return state;
 
     BinaryOperator::Opcode op = SE->getOpcode();
-    // FIXME: We should implicitly compare non-comparison expressions to 0.
-    if (!BinaryOperator::isComparisonOp(op))
-      return state;
+    // Implicitly compare non-comparison expressions to 0.
+    if (!BinaryOperator::isComparisonOp(op)) {
+      QualType T = SymMgr.getType(SE);
+      const llvm::APSInt &zero = BasicVals.getValue(0, T);
+      op = (Assumption ? BinaryOperator::NE : BinaryOperator::EQ);
+      return AssumeSymRel(state, SE, op, zero);
+    }
 
     // From here on out, op is the real comparison we'll be testing.
     if (!Assumption)