summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/ExprConstant.cpp
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2009-02-27 04:45:43 +0000
committerEli Friedman <eli.friedman@gmail.com>2009-02-27 04:45:43 +0000
commit4e7a241f4919fda2f58a50b9b304dcd9c6570a52 (patch)
treed673677e838e9a3db2df3b78985bf0797bcc74a2 /clang/lib/AST/ExprConstant.cpp
parent2c7bd6b0ac259a097191f91d8aa7155c09752c8f (diff)
downloadbcm5719-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.cpp26
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
//===----------------------------------------------------------------------===//
OpenPOWER on IntegriCloud