diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2009-05-22 10:24:05 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2009-05-22 10:24:05 +0000 |
commit | 5da1f0858748f39602a9b1f593f831afa3da7454 (patch) | |
tree | 7fa4b7eefbee2564ebc115cfd50b9c20e3582e6f /clang/lib | |
parent | 9a9c0f4eff9865274230dd8f2d9961166f3fe2e6 (diff) | |
download | bcm5719-llvm-5da1f0858748f39602a9b1f593f831afa3da7454.tar.gz bcm5719-llvm-5da1f0858748f39602a9b1f593f831afa3da7454.zip |
Factor the compound literal parsing out from ParseParenExpression and into a new ParseCompoundLiteralExpression.
No functionality change.
llvm-svn: 72259
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Parse/ParseExpr.cpp | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/clang/lib/Parse/ParseExpr.cpp b/clang/lib/Parse/ParseExpr.cpp index c7849341770..12ba001f0ea 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]. |