diff --git a/clang/include/clang/Parse/Parser.h b/clang/include/clang/Parse/Parser.h index 9cc5c9c71bfa..11eb3621f149 100644 --- a/clang/include/clang/Parse/Parser.h +++ b/clang/include/clang/Parse/Parser.h @@ -690,6 +690,10 @@ private: TypeTy *&CastTy, SourceLocation &RParenLoc); + OwningExprResult ParseCompoundLiteralExpression(TypeTy *Ty, + SourceLocation LParenLoc, + SourceLocation RParenLoc); + OwningExprResult ParseStringLiteralExpression(); //===--------------------------------------------------------------------===// diff --git a/clang/lib/Parse/ParseExpr.cpp b/clang/lib/Parse/ParseExpr.cpp index c78493417705..12ba001f0ea5 100644 --- a/clang/lib/Parse/ParseExpr.cpp +++ b/clang/lib/Parse/ParseExpr.cpp @@ -1239,14 +1239,8 @@ Parser::ParseParenExpression(ParenParseOption &ExprType, bool stopIfCastExpr, MatchRHSPunctuation(tok::r_paren, OpenLoc); if (Tok.is(tok::l_brace)) { - if (!getLang().C99) // Compound literals don't exist in C90. - Diag(OpenLoc, diag::ext_c99_compound_literal); - Result = ParseInitializer(); ExprType = CompoundLiteral; - if (!Result.isInvalid() && !Ty.isInvalid()) - Result = Actions.ActOnCompoundLiteral(OpenLoc, Ty.get(), RParenLoc, - move(Result)); - return move(Result); + return ParseCompoundLiteralExpression(Ty.get(), OpenLoc, RParenLoc); } if (ExprType == CastExpr) { @@ -1294,6 +1288,26 @@ Parser::ParseParenExpression(ParenParseOption &ExprType, bool stopIfCastExpr, return move(Result); } +/// ParseCompoundLiteralExpression - We have parsed the parenthesized type-name +/// and we are at the left brace. +/// +/// postfix-expression: [C99 6.5.2] +/// '(' type-name ')' '{' initializer-list '}' +/// '(' type-name ')' '{' initializer-list ',' '}' +/// +Parser::OwningExprResult +Parser::ParseCompoundLiteralExpression(TypeTy *Ty, + SourceLocation LParenLoc, + SourceLocation RParenLoc) { + assert(Tok.is(tok::l_brace) && "Not a compound literal!"); + if (!getLang().C99) // Compound literals don't exist in C90. + Diag(LParenLoc, diag::ext_c99_compound_literal); + OwningExprResult Result = ParseInitializer(); + if (!Result.isInvalid() && Ty) + return Actions.ActOnCompoundLiteral(LParenLoc, Ty, RParenLoc, move(Result)); + return move(Result); +} + /// ParseStringLiteralExpression - This handles the various token types that /// form string literals, and also handles string concatenation [C99 5.1.1.2, /// translation phase #6].