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;
+ }
};
}
}
bool VectorExprEvaluator::VisitUnaryImag(const UnaryOperator *E) {
- APValue Scratch;
- if (!Evaluate(Scratch, Info, E->getSubExpr()))
- Info.EvalStatus.HasSideEffects = true;
+ VisitIgnoredValue(E->getSubExpr());
return ValueInitialization(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()) {
return Success(LV.getComplexIntImag(), E);
}
- APValue Scratch;
- if (!Evaluate(Scratch, Info, E->getSubExpr()))
- Info.EvalStatus.HasSideEffects = true;
+ VisitIgnoredValue(E->getSubExpr());
return Success(0, 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;
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.
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;