aboutsummaryrefslogtreecommitdiff
path: root/lib/AST/ExprConstant.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2011-10-24 18:44:57 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2011-10-24 18:44:57 +0000
commit8327fad71da34492d82c532f42a58cb4baff81a3 (patch)
tree0ba48da8228d31bea338e370f619fdd0d072a167 /lib/AST/ExprConstant.cpp
parent32cb47174304bc7ec11478b9497c4e10f48273d9 (diff)
Constant expression evaluation: factor out handling of ignored values.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@142835 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/ExprConstant.cpp')
-rw-r--r--lib/AST/ExprConstant.cpp54
1 files changed, 15 insertions, 39 deletions
diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp
index 3bf9eb516f..e681e91544 100644
--- a/lib/AST/ExprConstant.cpp
+++ b/lib/AST/ExprConstant.cpp
@@ -493,6 +493,12 @@ public:
return DerivedValueInitialization(E);
}
+ /// Visit a value which is evaluated, but whose value is ignored.
+ void VisitIgnoredValue(const Expr *E) {
+ APValue Scratch;
+ if (!Evaluate(Scratch, Info, E))
+ Info.EvalStatus.HasSideEffects = true;
+ }
};
}
@@ -1010,9 +1016,7 @@ VectorExprEvaluator::ValueInitialization(const Expr *E) {
}
bool VectorExprEvaluator::VisitUnaryImag(const UnaryOperator *E) {
- APValue Scratch;
- if (!Evaluate(Scratch, Info, E->getSubExpr()))
- Info.EvalStatus.HasSideEffects = true;
+ VisitIgnoredValue(E->getSubExpr());
return ValueInitialization(E);
}
@@ -1408,16 +1412,8 @@ bool IntExprEvaluator::VisitCallExpr(const CallExpr *E) {
bool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
if (E->getOpcode() == BO_Comma) {
- if (!Visit(E->getRHS()))
- return false;
-
- // If we can't evaluate the LHS, it might have side effects;
- // conservatively mark it.
- APValue Scratch;
- if (!Evaluate(Scratch, Info, E->getLHS()))
- Info.EvalStatus.HasSideEffects = true;
-
- return true;
+ VisitIgnoredValue(E->getLHS());
+ return Visit(E->getRHS());
}
if (E->isLogicalOp()) {
@@ -2007,9 +2003,7 @@ bool IntExprEvaluator::VisitUnaryImag(const UnaryOperator *E) {
return Success(LV.getComplexIntImag(), E);
}
- APValue Scratch;
- if (!Evaluate(Scratch, Info, E->getSubExpr()))
- Info.EvalStatus.HasSideEffects = true;
+ VisitIgnoredValue(E->getSubExpr());
return Success(0, E);
}
@@ -2183,9 +2177,7 @@ bool FloatExprEvaluator::VisitUnaryImag(const UnaryOperator *E) {
return true;
}
- APValue Scratch;
- if (!Evaluate(Scratch, Info, E->getSubExpr()))
- Info.EvalStatus.HasSideEffects = true;
+ VisitIgnoredValue(E->getSubExpr());
const llvm::fltSemantics &Sem = Info.Ctx.getFloatTypeSemantics(E->getType());
Result = llvm::APFloat::getZero(Sem);
return true;
@@ -2210,16 +2202,8 @@ bool FloatExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) {
bool FloatExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
if (E->getOpcode() == BO_Comma) {
- if (!EvaluateFloat(E->getRHS(), Result, Info))
- return false;
-
- // If we can't evaluate the LHS, it might have side effects;
- // conservatively mark it.
- APValue Scratch;
- if (!Evaluate(Scratch, Info, E->getLHS()))
- Info.EvalStatus.HasSideEffects = true;
-
- return true;
+ VisitIgnoredValue(E->getLHS());
+ return Visit(E->getRHS());
}
// We can't evaluate pointer-to-member operations.
@@ -2495,16 +2479,8 @@ bool ComplexExprEvaluator::VisitCastExpr(const CastExpr *E) {
bool ComplexExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
if (E->getOpcode() == BO_Comma) {
- if (!Visit(E->getRHS()))
- return false;
-
- // If we can't evaluate the LHS, it might have side effects;
- // conservatively mark it.
- APValue Scratch;
- if (!Evaluate(Scratch, Info, E->getLHS()))
- Info.EvalStatus.HasSideEffects = true;
-
- return true;
+ VisitIgnoredValue(E->getLHS());
+ return Visit(E->getRHS());
}
if (!Visit(E->getLHS()))
return false;