diff options
| author | Eli Friedman <eli.friedman@gmail.com> | 2009-02-20 01:57:15 +0000 |
|---|---|---|
| committer | Eli Friedman <eli.friedman@gmail.com> | 2009-02-20 01:57:15 +0000 |
| commit | 0b8337c30bd530b755d06a9228a179e111c8062a (patch) | |
| tree | b8cd0feb1c57e2df81aed28cb94a4a1c535ce417 /clang | |
| parent | 63e03cbe8cf878c1c006734868ccf4937b273dda (diff) | |
| download | bcm5719-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.cpp | 9 | ||||
| -rw-r--r-- | clang/test/Sema/const-eval.c | 2 |
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)); |

