]> granicus.if.org Git - clang/commitdiff
Half of PR12088: parse braced-init-lists on the RHS of assignment operators.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Sun, 26 Feb 2012 23:40:27 +0000 (23:40 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Sun, 26 Feb 2012 23:40:27 +0000 (23:40 +0000)
If the assignment operator is a scalar type, we continue to incorrectly reject
the initializer, but semantic analysis (and codegen) is correct for overloaded
operators.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@151508 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Parse/ParseExpr.cpp

index fe8d464229d4fb5063e9f77948408be45550a6d6..26a2a11444cb0bb2fec91c8099937dca76fb99f4 100644 (file)
@@ -351,12 +351,23 @@ Parser::ParseRHSOfBinaryExpression(ExprResult LHS, prec::Level MinPrec) {
     // be a throw-expression, which is not a valid cast-expression.
     // Therefore we need some special-casing here.
     // Also note that the third operand of the conditional operator is
-    // an assignment-expression in C++.
+    // an assignment-expression in C++, and in C++11, we can have a
+    // braced-init-list on the RHS of an assignment.
     ExprResult RHS;
-    if (getLang().CPlusPlus && NextTokPrec <= prec::Conditional)
+    if (getLang().CPlusPlus0x && MinPrec == prec::Assignment &&
+        Tok.is(tok::l_brace)) {
+      Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);
+      RHS = ParseBraceInitializer();
+      if (LHS.isInvalid() || RHS.isInvalid())
+        return ExprError();
+      // A braced-init-list can never be followed by more operators.
+      return Actions.ActOnBinOp(getCurScope(), OpToken.getLocation(),
+                                OpToken.getKind(), LHS.take(), RHS.take());
+    } else if (getLang().CPlusPlus && NextTokPrec <= prec::Conditional) {
       RHS = ParseAssignmentExpression();
-    else
+    } else {
       RHS = ParseCastExpression(false);
+    }
 
     if (RHS.isInvalid())
       LHS = ExprError();