diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Parse/ParseInit.cpp | 21 | ||||
-rw-r--r-- | lib/Sema/Sema.h | 1 | ||||
-rw-r--r-- | lib/Sema/SemaExpr.cpp | 4 |
3 files changed, 15 insertions, 11 deletions
diff --git a/lib/Parse/ParseInit.cpp b/lib/Parse/ParseInit.cpp index 655d8e75c7..82a33c21da 100644 --- a/lib/Parse/ParseInit.cpp +++ b/lib/Parse/ParseInit.cpp @@ -236,14 +236,6 @@ ParseInitializerWithPotentialDesignator(InitListDesignations &Designations, Parser::ExprResult Parser::ParseBraceInitializer() { SourceLocation LBraceLoc = ConsumeBrace(); - // We support empty initializers, but tell the user that they aren't using - // C99-clean code. - if (Tok.is(tok::r_brace)) { - Diag(LBraceLoc, diag::ext_gnu_empty_initializer); - // Match the '}'. - return Actions.ActOnInitList(LBraceLoc, 0, 0, ConsumeBrace()); - } - /// InitExprs - This is the actual list of expressions contained in the /// initializer. llvm::SmallVector<ExprTy*, 8> InitExprs; @@ -252,6 +244,15 @@ Parser::ExprResult Parser::ParseBraceInitializer() { /// was specified for it, if any. InitListDesignations InitExprDesignations(Actions); + // We support empty initializers, but tell the user that they aren't using + // C99-clean code. + if (Tok.is(tok::r_brace)) { + Diag(LBraceLoc, diag::ext_gnu_empty_initializer); + // Match the '}'. + return Actions.ActOnInitList(LBraceLoc, 0, 0, InitExprDesignations, + ConsumeBrace()); + } + bool InitExprsOk = true; while (1) { @@ -293,8 +294,8 @@ Parser::ExprResult Parser::ParseBraceInitializer() { if (Tok.is(tok::r_brace)) break; } if (InitExprsOk && Tok.is(tok::r_brace)) - return Actions.ActOnInitList(LBraceLoc, &InitExprs[0], InitExprs.size(), - ConsumeBrace()); + return Actions.ActOnInitList(LBraceLoc, &InitExprs[0], InitExprs.size(), + InitExprDesignations, ConsumeBrace()); // On error, delete any parsed subexpressions. for (unsigned i = 0, e = InitExprs.size(); i != e; ++i) diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h index ef34a10534..c68776a80f 100644 --- a/lib/Sema/Sema.h +++ b/lib/Sema/Sema.h @@ -614,6 +614,7 @@ public: virtual ExprResult ActOnInitList(SourceLocation LParenLoc, ExprTy **InitList, unsigned NumInit, + InitListDesignations &Designators, SourceLocation RParenLoc); virtual ExprResult ActOnBinOp(SourceLocation TokLoc, tok::TokenKind Kind, diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 13b3959d8c..fee94568b7 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -1247,11 +1247,13 @@ ActOnCompoundLiteral(SourceLocation LParenLoc, TypeTy *Ty, if (CheckForConstantInitializer(literalExpr, literalType)) return true; } - return new CompoundLiteralExpr(LParenLoc, literalType, literalExpr, isFileScope); + return new CompoundLiteralExpr(LParenLoc, literalType, literalExpr, + isFileScope); } Action::ExprResult Sema:: ActOnInitList(SourceLocation LBraceLoc, ExprTy **initlist, unsigned NumInit, + InitListDesignations &Designators, SourceLocation RBraceLoc) { Expr **InitList = reinterpret_cast<Expr**>(initlist); |