[cfe-commits] r153235 - /cfe/trunk/lib/AST/ExprConstant.cpp

Argyrios Kyrtzidis akyrtzi at gmail.com
Wed Mar 21 19:13:07 PDT 2012


Author: akirtzidis
Date: Wed Mar 21 21:13:06 2012
New Revision: 153235

URL: http://llvm.org/viewvc/llvm-project?rev=153235&view=rev
Log:
Simplify DataRecursiveIntBinOpEvaluator::VisitBinOp() a bit and make sure we don't
evaluate RHS if LHS could not be evaluated and keepEvaluatingAfterFailure() is false.

Modified:
    cfe/trunk/lib/AST/ExprConstant.cpp

Modified: cfe/trunk/lib/AST/ExprConstant.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=153235&r1=153234&r2=153235&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ExprConstant.cpp (original)
+++ cfe/trunk/lib/AST/ExprConstant.cpp Wed Mar 21 21:13:06 2012
@@ -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;





More information about the cfe-commits mailing list