diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index 8bf2cb670a1dd2840ef8f009573ac7ff69902448..be78a782bec75eaccef096fdc2563cb181c0444b 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -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;