|
@@ -336,7 +336,17 @@ Parser::ParseRHSOfBinaryExpression(ExprResult LHS, prec::Level MinPrec) {
|
|
|
// Special case handling for the ternary operator.
|
|
|
ExprResult TernaryMiddle(true);
|
|
|
if (NextTokPrec == prec::Conditional) {
|
|
|
- if (Tok.isNot(tok::colon)) {
|
|
|
+ if (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace)) {
|
|
|
+ // Parse a braced-init-list here for error recovery purposes.
|
|
|
+ SourceLocation BraceLoc = Tok.getLocation();
|
|
|
+ TernaryMiddle = ParseBraceInitializer();
|
|
|
+ if (!TernaryMiddle.isInvalid()) {
|
|
|
+ Diag(BraceLoc, diag::err_init_list_bin_op)
|
|
|
+ << /*RHS*/ 1 << PP.getSpelling(OpToken)
|
|
|
+ << Actions.getExprRange(TernaryMiddle.get());
|
|
|
+ TernaryMiddle = ExprError();
|
|
|
+ }
|
|
|
+ } else if (Tok.isNot(tok::colon)) {
|
|
|
// Don't parse FOO:BAR as if it were a typo for FOO::BAR.
|
|
|
ColonProtectionRAIIObject X(*this);
|
|
|
|
|
@@ -345,11 +355,6 @@ Parser::ParseRHSOfBinaryExpression(ExprResult LHS, prec::Level MinPrec) {
|
|
|
// In particular, the RHS of the '?' is 'expression', not
|
|
|
// 'logical-OR-expression' as we might expect.
|
|
|
TernaryMiddle = ParseExpression();
|
|
|
- if (TernaryMiddle.isInvalid()) {
|
|
|
- Actions.CorrectDelayedTyposInExpr(LHS);
|
|
|
- LHS = ExprError();
|
|
|
- TernaryMiddle = nullptr;
|
|
|
- }
|
|
|
} else {
|
|
|
// Special case handling of "X ? Y : Z" where Y is empty:
|
|
|
// logical-OR-expression '?' ':' conditional-expression [GNU]
|
|
@@ -357,6 +362,12 @@ Parser::ParseRHSOfBinaryExpression(ExprResult LHS, prec::Level MinPrec) {
|
|
|
Diag(Tok, diag::ext_gnu_conditional_expr);
|
|
|
}
|
|
|
|
|
|
+ if (TernaryMiddle.isInvalid()) {
|
|
|
+ Actions.CorrectDelayedTyposInExpr(LHS);
|
|
|
+ LHS = ExprError();
|
|
|
+ TernaryMiddle = nullptr;
|
|
|
+ }
|
|
|
+
|
|
|
if (!TryConsumeToken(tok::colon, ColonLoc)) {
|
|
|
// Otherwise, we're missing a ':'. Assume that this was a typo that
|
|
|
// the user forgot. If we're not in a macro expansion, we can suggest
|
|
@@ -469,6 +480,11 @@ Parser::ParseRHSOfBinaryExpression(ExprResult LHS, prec::Level MinPrec) {
|
|
|
if (ThisPrec == prec::Assignment) {
|
|
|
Diag(OpToken, diag::warn_cxx98_compat_generalized_initializer_lists)
|
|
|
<< Actions.getExprRange(RHS.get());
|
|
|
+ } else if (ColonLoc.isValid()) {
|
|
|
+ Diag(ColonLoc, diag::err_init_list_bin_op)
|
|
|
+ << /*RHS*/1 << ":"
|
|
|
+ << Actions.getExprRange(RHS.get());
|
|
|
+ LHS = ExprError();
|
|
|
} else {
|
|
|
Diag(OpToken, diag::err_init_list_bin_op)
|
|
|
<< /*RHS*/1 << PP.getSpelling(OpToken)
|