Add support for * (unary dereference) operator to ExprConstant.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65105 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp
index fe44297..0fcbdf1 100644
--- a/lib/AST/ExprConstant.cpp
+++ b/lib/AST/ExprConstant.cpp
@@ -157,6 +157,7 @@
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 @@
return Result;
}
+APValue LValueExprEvaluator::VisitUnaryDeref(UnaryOperator *E)
+{
+ APValue Result;
+ if (!EvaluatePointer(E->getSubExpr(), Result, Info))
+ return APValue();
+ return Result;
+}
+
//===----------------------------------------------------------------------===//
// Pointer Evaluation
//===----------------------------------------------------------------------===//
diff --git a/test/Sema/const-eval.c b/test/Sema/const-eval.c
index af785e4..30075d5 100644
--- a/test/Sema/const-eval.c
+++ b/test/Sema/const-eval.c
@@ -38,3 +38,5 @@
struct s {
int a[(int)-1.0f]; // expected-error {{array size is negative}}
};
+
+EVAL_EXPR(19, ((int)&*(char*)10 == 10 ? 1 : -1));