diff options
Diffstat (limited to 'lib/Parse')
-rw-r--r-- | lib/Parse/ParseExpr.cpp | 14 | ||||
-rw-r--r-- | lib/Parse/ParseInit.cpp | 7 |
2 files changed, 13 insertions, 8 deletions
diff --git a/lib/Parse/ParseExpr.cpp b/lib/Parse/ParseExpr.cpp index 92bbbd7bf9..be5c7d7808 100644 --- a/lib/Parse/ParseExpr.cpp +++ b/lib/Parse/ParseExpr.cpp @@ -172,8 +172,8 @@ static prec::Level getBinOpPrecedence(tok::TokenKind Kind, /// = *= /= %= += -= <<= >>= &= ^= |= /// /// expression: [C99 6.5.17] -/// assignment-expression -/// expression ',' assignment-expression +/// assignment-expression ...[opt] +/// expression ',' assignment-expression ...[opt] /// ExprResult Parser::ParseExpression() { ExprResult LHS(ParseAssignmentExpression()); @@ -1030,8 +1030,8 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression, /// '(' type-name ')' '{' initializer-list ',' '}' /// /// argument-expression-list: [C99 6.5.2] -/// argument-expression -/// argument-expression-list ',' assignment-expression +/// argument-expression ...[opt] +/// argument-expression-list ',' assignment-expression ...[opt] /// ExprResult Parser::ParsePostfixExpressionSuffix(ExprResult LHS) { @@ -1692,8 +1692,8 @@ ExprResult Parser::ParseStringLiteralExpression() { /// argument-expression-list , assignment-expression /// /// [C++] expression-list: -/// [C++] assignment-expression -/// [C++] expression-list , assignment-expression +/// [C++] assignment-expression ...[opt] +/// [C++] expression-list , assignment-expression ...[opt] /// bool Parser::ParseExpressionList(llvm::SmallVectorImpl<Expr*> &Exprs, llvm::SmallVectorImpl<SourceLocation> &CommaLocs, @@ -1710,6 +1710,8 @@ bool Parser::ParseExpressionList(llvm::SmallVectorImpl<Expr*> &Exprs, } ExprResult Expr(ParseAssignmentExpression()); + if (Tok.is(tok::ellipsis)) + Expr = Actions.ActOnPackExpansion(Expr.get(), ConsumeToken()); if (Expr.isInvalid()) return true; diff --git a/lib/Parse/ParseInit.cpp b/lib/Parse/ParseInit.cpp index c2675f33e7..82dda2b793 100644 --- a/lib/Parse/ParseInit.cpp +++ b/lib/Parse/ParseInit.cpp @@ -310,8 +310,8 @@ ExprResult Parser::ParseInitializerWithPotentialDesignator() { /// [GNU] '{' '}' /// /// initializer-list: -/// designation[opt] initializer -/// initializer-list ',' designation[opt] initializer +/// designation[opt] initializer ...[opt] +/// initializer-list ',' designation[opt] initializer ...[opt] /// ExprResult Parser::ParseBraceInitializer() { InMessageExpressionRAIIObject InMessage(*this, false); @@ -344,6 +344,9 @@ ExprResult Parser::ParseBraceInitializer() { else SubElt = ParseInitializer(); + if (Tok.is(tok::ellipsis)) + SubElt = Actions.ActOnPackExpansion(SubElt.get(), ConsumeToken()); + // If we couldn't parse the subelement, bail out. if (!SubElt.isInvalid()) { InitExprs.push_back(SubElt.release()); |