Parse brace initializers as default arguments. PR12236.

llvm-svn: 152721
This commit is contained in:
Sebastian Redl 2012-03-14 15:54:00 +00:00
parent fe66dd624d
commit db63af2216
3 changed files with 18 additions and 2 deletions

View File

@ -319,7 +319,11 @@ void Parser::ParseLexedMethodDeclaration(LateParsedMethodDeclaration &LM) {
Sema::PotentiallyEvaluatedIfUsed,
LM.DefaultArgs[I].Param);
ExprResult DefArgResult(ParseAssignmentExpression());
ExprResult DefArgResult;
if (Tok.is(tok::l_brace))
DefArgResult = ParseBraceInitializer();
else
DefArgResult = ParseAssignmentExpression();
if (DefArgResult.isInvalid())
Actions.ActOnParamDefaultArgumentError(LM.DefaultArgs[I].Param);
else {

View File

@ -4169,6 +4169,7 @@ void Parser::ParseFunctionDeclaratorIdentifierList(
/// parameter-declaration: [C99 6.7.5]
/// declaration-specifiers declarator
/// [C++] declaration-specifiers declarator '=' assignment-expression
/// [C++11] initializer-clause
/// [GNU] declaration-specifiers declarator attributes
/// declaration-specifiers abstract-declarator[opt]
/// [C++] declaration-specifiers abstract-declarator[opt]
@ -4280,7 +4281,11 @@ void Parser::ParseParameterDeclarationClause(
Sema::PotentiallyEvaluatedIfUsed,
Param);
ExprResult DefArgResult(ParseAssignmentExpression());
ExprResult DefArgResult;
if (Tok.is(tok::l_brace))
DefArgResult = ParseBraceInitializer();
else
DefArgResult = ParseAssignmentExpression();
if (DefArgResult.isInvalid()) {
Actions.ActOnParamDefaultArgumentError(Param);
SkipUntil(tok::comma, tok::r_paren, true, true);

View File

@ -96,6 +96,13 @@ namespace integral {
(void) int({0}); // expected-error {{functional-style cast}}
new int({0}); // expected-error {{cannot initialize}}
}
void default_argument(int i = {}) {
}
struct DefaultArgument {
void default_argument(int i = {}) {
}
};
}
namespace PR12118 {