aboutsummaryrefslogtreecommitdiff
path: root/lib/Parse/ParseExpr.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2012-02-26 23:40:27 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2012-02-26 23:40:27 +0000
commitc56ab4358fc1bcf1fb755475088fed09b8cfaa1e (patch)
treefb4e067ccfc5e6ef5fc2d4ff5a08bf64ff9868ff /lib/Parse/ParseExpr.cpp
parente75f33063e72f4ca87b8ba17580d5ca4c90d9e80 (diff)
Half of PR12088: parse braced-init-lists on the RHS of assignment operators.
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
Diffstat (limited to 'lib/Parse/ParseExpr.cpp')
-rw-r--r--lib/Parse/ParseExpr.cpp17
1 files changed, 14 insertions, 3 deletions
diff --git a/lib/Parse/ParseExpr.cpp b/lib/Parse/ParseExpr.cpp
index fe8d464229..26a2a11444 100644
--- a/lib/Parse/ParseExpr.cpp
+++ b/lib/Parse/ParseExpr.cpp
@@ -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();