Prefer C++ Initializer when parsing init-declarators.

This commit is contained in:
Roberto Raggi
2009-03-17 14:12:18 +01:00
parent f9a3df1847
commit e3baca2e9a
2 changed files with 22 additions and 3 deletions

View File

@@ -977,7 +977,7 @@ bool Parser::parseCoreDeclarator(DeclaratorAST *&node)
return false;
}
bool Parser::parseDeclarator(DeclaratorAST *&node)
bool Parser::parseDeclarator(DeclaratorAST *&node, bool stopAtCppInitializer)
{
if (! parseCoreDeclarator(node))
return false;
@@ -988,6 +988,25 @@ bool Parser::parseDeclarator(DeclaratorAST *&node)
unsigned startOfPostDeclarator = cursor();
if (LA() == T_LPAREN) {
if (stopAtCppInitializer) {
unsigned lparen_token = cursor();
ExpressionAST *initializer = 0;
bool blocked = blockErrors(true);
if (parseInitializer(initializer)) {
if (NestedExpressionAST *expr = initializer->asNestedExpression()) {
if (expr->expression && expr->rparen_token && (LA() == T_COMMA || LA() == T_SEMICOLON)) {
rewind(lparen_token);
blockErrors(blocked);
return true;
}
}
}
blockErrors(blocked);
rewind(lparen_token);
}
FunctionDeclaratorAST *ast = new (_pool) FunctionDeclaratorAST;
ast->lparen_token = consumeToken();
parseParameterDeclarationClause(ast->parameters);
@@ -1494,7 +1513,7 @@ bool Parser::parseInitDeclarator(DeclaratorAST *&node,
if (acceptStructDeclarator && LA() == T_COLON) {
// anonymous bit-field declaration.
// ### TODO create the AST
} else if (! parseDeclarator(node)) {
} else if (! parseDeclarator(node, /*stopAtCppInitializer = */ ! acceptStructDeclarator)) {
return false;
}