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 {