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
diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp
index b9f3c77..9eeaa86 100644
--- a/lib/AST/ExprConstant.cpp
+++ b/lib/AST/ExprConstant.cpp
@@ -513,14 +513,17 @@
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 @@
/// 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 {