Improved error recovery when parsing ctor-initializers.

This commit is contained in:
Roberto Raggi
2009-12-07 14:50:54 +01:00
parent fd4aee7ef6
commit 59e0729826

View File

@@ -1832,16 +1832,32 @@ bool Parser::parseMemInitializerList(MemInitializerListAST *&node)
if (parseMemInitializer(*initializer)) {
initializer = &(*initializer)->next;
while (LA() == T_COMMA) {
consumeToken(); // consume T_COMMA
if (parseMemInitializer(*initializer))
initializer = &(*initializer)->next;
else
_translationUnit->error(cursor(), "expected a member initializer");
while (true) {
if (LA() == T_LBRACE)
break;
else if (LA() == T_COMMA || (LA() == T_IDENTIFIER && (LA(2) == T_LPAREN || LA(2) == T_COLON_COLON))) {
if (LA() != T_COMMA)
_translationUnit->error(cursor(), "expected `,'");
else
consumeToken();
if (parseMemInitializer(*initializer))
initializer = &(*initializer)->next;
else
_translationUnit->error(cursor(), "expected a member initializer");
} else break;
}
if (LA() != T_LBRACE)
_translationUnit->error(cursor(), "expected `{'");
return true;
}
return false;
}
@@ -2892,10 +2908,26 @@ bool Parser::parseSimpleDeclaration(DeclarationAST *&node,
return true;
} else if (! _inFunctionBody && declarator && (LA() == T_COLON || LA() == T_LBRACE || LA() == T_TRY)) {
CtorInitializerAST *ctor_initializer = 0;
if (LA() == T_COLON)
bool hasCtorInitializer = false;
if (LA() == T_COLON) {
hasCtorInitializer = true;
parseCtorInitializer(ctor_initializer);
if (LA() == T_LBRACE) {
if (LA() != T_LBRACE) {
const unsigned pos = cursor();
for (int n = 0; n < 3 && LA(); consumeToken(), ++n)
if (LA() == T_LBRACE)
break;
if (LA() != T_LBRACE) {
_translationUnit->error(pos, "unexpected token `%s'", _translationUnit->spell(pos));
rewind(pos);
}
}
}
if (LA() == T_LBRACE || hasCtorInitializer) {
FunctionDefinitionAST *ast = new (_pool) FunctionDefinitionAST;
ast->qt_invokable_token = qt_invokable_token;
ast->decl_specifier_list = decl_specifier_seq;