summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2009-02-20 01:57:15 +0000
committerEli Friedman <eli.friedman@gmail.com>2009-02-20 01:57:15 +0000
commit0b8337c30bd530b755d06a9228a179e111c8062a (patch)
treeb8cd0feb1c57e2df81aed28cb94a4a1c535ce417 /clang
parent63e03cbe8cf878c1c006734868ccf4937b273dda (diff)
downloadbcm5719-llvm-0b8337c30bd530b755d06a9228a179e111c8062a.tar.gz
bcm5719-llvm-0b8337c30bd530b755d06a9228a179e111c8062a.zip
Add support for * (unary dereference) operator to ExprConstant.
llvm-svn: 65105
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/AST/ExprConstant.cpp9
-rw-r--r--clang/test/Sema/const-eval.c2
2 files changed, 11 insertions, 0 deletions
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index fe442974383..0fcbdf12f06 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -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
//===----------------------------------------------------------------------===//
diff --git a/clang/test/Sema/const-eval.c b/clang/test/Sema/const-eval.c
index af785e4bddb..30075d5c77b 100644
--- a/clang/test/Sema/const-eval.c
+++ b/clang/test/Sema/const-eval.c
@@ -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));
OpenPOWER on IntegriCloud