diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2009-02-27 04:45:43 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2009-02-27 04:45:43 +0000 |
commit | 4e7a241f4919fda2f58a50b9b304dcd9c6570a52 (patch) | |
tree | d673677e838e9a3db2df3b78985bf0797bcc74a2 /clang/lib/AST/ExprConstant.cpp | |
parent | 2c7bd6b0ac259a097191f91d8aa7155c09752c8f (diff) | |
download | bcm5719-llvm-4e7a241f4919fda2f58a50b9b304dcd9c6570a52.tar.gz bcm5719-llvm-4e7a241f4919fda2f58a50b9b304dcd9c6570a52.zip |
Some minor improvements to Evaluate.
llvm-svn: 65613
Diffstat (limited to 'clang/lib/AST/ExprConstant.cpp')
-rw-r--r-- | clang/lib/AST/ExprConstant.cpp | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 5cfc6e6ab31..4f55f8d7642 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -636,16 +636,24 @@ public: return Success(0, E); } + bool VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E) { + return Success(0, E); + } + bool VisitUnaryTypeTraitExpr(const UnaryTypeTraitExpr *E) { return Success(E->EvaluateTrait(), E); } + bool VisitChooseExpr(const ChooseExpr *E); + bool VisitUnaryReal(const UnaryOperator *E) { + return Visit(E->getSubExpr()); + } + bool VisitUnaryImag(const UnaryOperator *E); + private: unsigned GetAlignOfExpr(const Expr *E); unsigned GetAlignOfType(QualType T); - // FIXME: Missing: __real__/__imag__, array subscript of vector, - // member of vector, __builtin_choose_expr, - // ImplicitValueInitExpr + // FIXME: Missing: array subscript of vector, member of vector }; } // end anonymous namespace @@ -1170,6 +1178,18 @@ bool IntExprEvaluator::VisitCastExpr(CastExpr *E) { return Success(HandleFloatToIntCast(DestType, SrcType, F, Info.Ctx), E); } +bool IntExprEvaluator::VisitChooseExpr(const ChooseExpr *E) { + Expr* EvalExpr = E->isConditionTrue(Info.Ctx) ? E->getLHS() : E->getRHS(); + + return Visit(EvalExpr); +} + +bool IntExprEvaluator::VisitUnaryImag(const UnaryOperator *E) { + if (!E->getSubExpr()->isEvaluatable(Info.Ctx)) + Info.EvalResult.HasSideEffects = true; + return Success(0, E); +} + //===----------------------------------------------------------------------===// // Float Evaluation //===----------------------------------------------------------------------===// |