]> granicus.if.org Git - clang/commitdiff
PR4097: add logic to Evaluate to handle pointer equality comparisons.
authorEli Friedman <eli.friedman@gmail.com>
Tue, 28 Apr 2009 19:17:36 +0000 (19:17 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Tue, 28 Apr 2009 19:17:36 +0000 (19:17 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70317 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ExprConstant.cpp
test/Sema/const-eval.c

index 1ea252fecb76297d1255c6db54444d29f00333b6..45cf24b96389cc0fe8784c85d2892aca274315b7 100644 (file)
@@ -900,8 +900,8 @@ bool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
     }
   }
   
-  if (E->getOpcode() == BinaryOperator::Sub) {
-    if (LHSTy->isPointerType() && RHSTy->isPointerType()) {
+  if (LHSTy->isPointerType() && RHSTy->isPointerType()) {
+    if (E->getOpcode() == BinaryOperator::Sub || E->isEqualityOp()) {
       APValue LHSValue;
       if (!EvaluatePointer(E->getLHS(), LHSValue, Info))
         return false;
@@ -915,13 +915,22 @@ bool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
       if (LHSValue.getLValueBase() || RHSValue.getLValueBase())
         return false;
 
-      const QualType Type = E->getLHS()->getType();
-      const QualType ElementType = Type->getAsPointerType()->getPointeeType();
+      if (E->getOpcode() == BinaryOperator::Sub) {
+        const QualType Type = E->getLHS()->getType();
+        const QualType ElementType = Type->getAsPointerType()->getPointeeType();
 
-      uint64_t D = LHSValue.getLValueOffset() - RHSValue.getLValueOffset();
-      D /= Info.Ctx.getTypeSize(ElementType) / 8;
+        uint64_t D = LHSValue.getLValueOffset() - RHSValue.getLValueOffset();
+        D /= Info.Ctx.getTypeSize(ElementType) / 8;
 
-      return Success(D, E);
+        return Success(D, E);
+      }
+      bool Result;
+      if (E->getOpcode() == BinaryOperator::EQ) {
+        Result = LHSValue.getLValueOffset() == RHSValue.getLValueOffset();
+      } else if (E->getOpcode() == BinaryOperator::NE) {
+        Result = LHSValue.getLValueOffset() != RHSValue.getLValueOffset();
+      }
+      return Success(Result, E);
     }
   }
   if (!LHSTy->isIntegralType() ||
index ce1aacd2745af934c6d5b138ccf1fe4ba42e7493..79f96b9c39bff756c6b6436f93c2093c0ba5fc03 100644 (file)
@@ -63,3 +63,5 @@ static struct a V2 = (struct a)(struct a){ 1, 2};
 static const struct a V1 = (struct a){ 1, 2};
 
 EVAL_EXPR(30, (int)(_Complex float)((1<<30)-1) == (1<<30) ? 1 : -1)
+EVAL_EXPR(31, (int*)0 == (int*)0 ? 1 : -1)
+EVAL_EXPR(32, (int*)0 != (int*)0 ? -1 : 1)