diff options
Diffstat (limited to 'lib/AST/ExprConstant.cpp')
-rw-r--r-- | lib/AST/ExprConstant.cpp | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp index 583bbfc988..0d8490e137 100644 --- a/lib/AST/ExprConstant.cpp +++ b/lib/AST/ExprConstant.cpp @@ -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,8 +4599,8 @@ 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; |