Simplify DataRecursiveIntBinOpEvaluator::VisitBinOp() a bit and make sure we don't
evaluate RHS if LHS could not be evaluated and keepEvaluatingAfterFailure() is false.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@153235 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp
index 583bbfc..0d8490e 100644
--- a/lib/AST/ExprConstant.cpp
+++ b/lib/AST/ExprConstant.cpp
@@ -4537,8 +4537,8 @@
     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 @@
 }
 
 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 @@
       // 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 @@
          E->getRHS()->getType()->isIntegralOrEnumerationType());
   
   if (LHSResult.Failed && !Info.keepEvaluatingAfterFailure())
-    return false;
-  
+    return false; // Ignore RHS;
+
   return true;
 }
 
@@ -4803,17 +4802,14 @@
       
     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;