From 4fdfb0965b396f2778091f7e6c051d17ff9791ba Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Mon, 1 Dec 2008 06:44:05 +0000 Subject: [PATCH] Generate the correct results for the comma expression. Fixes PR3123. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60334 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AST/ExprConstant.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp index b9f3c77363..9eeaa868a5 100644 --- a/lib/AST/ExprConstant.cpp +++ b/lib/AST/ExprConstant.cpp @@ -513,14 +513,17 @@ bool IntExprEvaluator::VisitCallExpr(const CallExpr *E) { bool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { if (E->getOpcode() == BinaryOperator::Comma) { - // Evaluate the side that actually matters; this needs to be - // handled specially because calling Visit() on the LHS can - // have strange results when it doesn't have an integral type. if (!Visit(E->getRHS())) return false; - - if (Info.ShortCircuit) + + if (!Info.ShortCircuit) { + // If we can't evaluate the LHS, it must be because it has + // side effects. + if (!E->getLHS()->isEvaluatable(Info.Ctx)) + Info.EvalResult.HasSideEffects = true; + return Extension(E->getOperatorLoc(), diag::note_comma_in_ice, E); + } return true; } @@ -1202,8 +1205,8 @@ bool Expr::Evaluate(APValue &Result, ASTContext &Ctx, bool *isEvaluated) const { /// isEvaluatable - Call Evaluate to see if this expression can be constant /// folded, but discard the result. bool Expr::isEvaluatable(ASTContext &Ctx) const { - APValue V; - return Evaluate(V, Ctx); + EvalResult Result; + return Evaluate(Result, Ctx) && !Result.HasSideEffects; } APSInt Expr::EvaluateAsInt(ASTContext &Ctx) const {