]> granicus.if.org Git - clang/commitdiff
PR11391: Don't try to evaluate the LHS of a _Complex assignment as an rvalue.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 16 Nov 2011 17:22:48 +0000 (17:22 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 16 Nov 2011 17:22:48 +0000 (17:22 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@144799 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ExprConstant.cpp
test/Sema/const-eval.c

index 699d81715e3c0ece9b30e7aff1b6061b85b7a89a..f461ec642906d50a8963d868f61dff6d7374f7a6 100644 (file)
@@ -3695,10 +3695,14 @@ bool ComplexExprEvaluator::VisitCastExpr(const CastExpr *E) {
 }
 
 bool ComplexExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {
+  if (E->isPtrMemOp() || E->isAssignmentOp())
+    return ExprEvaluatorBaseTy::VisitBinaryOperator(E);
+
   if (E->getOpcode() == BO_Comma) {
     VisitIgnoredValue(E->getLHS());
     return Visit(E->getRHS());
   }
+
   if (!Visit(E->getLHS()))
     return false;
 
index 094d1ce716089ed1ccf4f6e285f0728b3b34cb16..8904e12bf7ab2fd54602ff4c2813191394a539db 100644 (file)
@@ -108,3 +108,7 @@ int literalVsNull2 = 0 == "foo";
 
 // PR11385.
 int castViaInt[*(int*)(unsigned long)"test"]; // expected-error {{variable length array}}
+
+// PR11391.
+struct PR11391 { _Complex float f; } pr11391;
+EVAL_EXPR(42, __builtin_constant_p(pr11391.f = 1))