Simplify DataRecursiveIntBinOpEvaluator::VisitBinOp() a bit and make sure we don't

evaluate RHS if LHS could not be evaluated and keepEvaluatingAfterFailure() is false.

llvm-svn: 153235
This commit is contained in:
Argyrios Kyrtzidis 2012-03-22 02:13:06 +00:00
parent 12da169839
commit 5957b7042a
1 changed files with 9 additions and 13 deletions

View File

@ -4537,8 +4537,8 @@ private:
return Info.CCEDiag(E, D);
}
bool VisitBinOpLHSOnly(const EvalResult &LHSResult, const BinaryOperator *E,
bool &IgnoreRHS, APValue &Result,
// \brief Returns true if visiting the RHS is necessary, false otherwise.
bool VisitBinOpLHSOnly(EvalResult &LHSResult, const BinaryOperator *E,
bool &SuppressRHSDiags);
bool VisitBinOp(const EvalResult &LHSResult, const EvalResult &RHSResult,
@ -4563,8 +4563,7 @@ private:
}
bool DataRecursiveIntBinOpEvaluator::
VisitBinOpLHSOnly(const EvalResult &LHSResult, const BinaryOperator *E,
bool &IgnoreRHS, APValue &Result,
VisitBinOpLHSOnly(EvalResult &LHSResult, const BinaryOperator *E,
bool &SuppressRHSDiags) {
if (E->getOpcode() == BO_Comma) {
// Ignore LHS but note if we could not evaluate it.
@ -4579,8 +4578,8 @@ bool DataRecursiveIntBinOpEvaluator::
// We were able to evaluate the LHS, see if we can get away with not
// evaluating the RHS: 0 && X -> 0, 1 || X -> 1
if (lhsResult == (E->getOpcode() == BO_LOr)) {
IgnoreRHS = true;
return Success(lhsResult, E, Result);
Success(lhsResult, E, LHSResult.Val);
return false; // Ignore RHS
}
} else {
// Since we weren't able to evaluate the left hand side, it
@ -4600,7 +4599,7 @@ bool DataRecursiveIntBinOpEvaluator::
E->getRHS()->getType()->isIntegralOrEnumerationType());
if (LHSResult.Failed && !Info.keepEvaluatingAfterFailure())
return false;
return false; // Ignore RHS;
return true;
}
@ -4803,17 +4802,14 @@ void DataRecursiveIntBinOpEvaluator::process(EvalResult &Result) {
case Job::BinOpKind: {
const BinaryOperator *Bop = cast<BinaryOperator>(job.E);
job.LHSResult.swap(Result);
bool IgnoreRHS = false;
bool SuppressRHSDiags = false;
Result.Failed = !VisitBinOpLHSOnly(job.LHSResult, Bop, IgnoreRHS,
Result.Val, SuppressRHSDiags);
if (IgnoreRHS) {
if (!VisitBinOpLHSOnly(Result, Bop, SuppressRHSDiags)) {
Queue.pop_back();
return;
}
if (SuppressRHSDiags)
job.startSpeculativeEval(Info);
job.LHSResult.swap(Result);
job.Kind = Job::BinOpVisitedLHSKind;
enqueue(Bop->getRHS());
return;