forked from OSchip/llvm-project
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:
parent
12da169839
commit
5957b7042a
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue