diff options
| author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2012-03-22 02:13:06 +0000 |
|---|---|---|
| committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2012-03-22 02:13:06 +0000 |
| commit | 5957b7042a919fedc91040aa9c481ef94b09e62a (patch) | |
| tree | daae42f3511957fa9e9c338087ccc7e2b4775aca | |
| parent | 12da1698391f3fc0359a0413e616978a20443c16 (diff) | |
| download | bcm5719-llvm-5957b7042a919fedc91040aa9c481ef94b09e62a.tar.gz bcm5719-llvm-5957b7042a919fedc91040aa9c481ef94b09e62a.zip | |
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
| -rw-r--r-- | clang/lib/AST/ExprConstant.cpp | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 583bbfc9883..0d8490e137d 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/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; |

