summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus/Parser.cpp
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2009-12-07 14:50:54 +0100
committerRoberto Raggi <roberto.raggi@nokia.com>2009-12-07 14:51:29 +0100
commit59e072982699c7cf28842480afab4cb818c571fd (patch)
tree8808755b28f384ac2fd4f2436c8f2989d797c1b1 /src/shared/cplusplus/Parser.cpp
parentfd4aee7ef67a187e4228155e1a6e4909d302b6f0 (diff)
downloadqt-creator-59e072982699c7cf28842480afab4cb818c571fd.tar.gz
Improved error recovery when parsing ctor-initializers.
Diffstat (limited to 'src/shared/cplusplus/Parser.cpp')
-rw-r--r--src/shared/cplusplus/Parser.cpp48
1 files changed, 40 insertions, 8 deletions
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index 8bf2cb670a..be78a782be 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;