]> granicus.if.org Git - clang/commitdiff
Add support for * (unary dereference) operator to ExprConstant.
authorEli Friedman <eli.friedman@gmail.com>
Fri, 20 Feb 2009 01:57:15 +0000 (01:57 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Fri, 20 Feb 2009 01:57:15 +0000 (01:57 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65105 91177308-0d34-0410-b5e6-96231b3b80d8

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

index fe4429743834d67c19510e01bfaada782105c76a..0fcbdf12f06997cedf3c04b173996dd7b3997912 100644 (file)
@@ -157,6 +157,7 @@ public:
   APValue VisitMemberExpr(MemberExpr *E);
   APValue VisitStringLiteral(StringLiteral *E) { return APValue(E, 0); }
   APValue VisitArraySubscriptExpr(ArraySubscriptExpr *E);
+  APValue VisitUnaryDeref(UnaryOperator *E);
 };
 } // end anonymous namespace
 
@@ -234,6 +235,14 @@ APValue LValueExprEvaluator::VisitArraySubscriptExpr(ArraySubscriptExpr *E)
   return Result;
 }
 
+APValue LValueExprEvaluator::VisitUnaryDeref(UnaryOperator *E)
+{
+  APValue Result;
+  if (!EvaluatePointer(E->getSubExpr(), Result, Info))
+    return APValue();
+  return Result;
+}
+
 //===----------------------------------------------------------------------===//
 // Pointer Evaluation
 //===----------------------------------------------------------------------===//
index af785e4bddb990336eaf55a0d0618d8a2938b310..30075d5c77bd5ecc3f5a031aace3a9b8508c7f0c 100644 (file)
@@ -38,3 +38,5 @@ EVAL_EXPR(18, ((int)((void*)10 + 10)) == 20 ? 1 : -1);
 struct s {
   int a[(int)-1.0f]; // expected-error {{array size is negative}}
 };
+
+EVAL_EXPR(19, ((int)&*(char*)10 == 10 ? 1 : -1));