summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus/Parser.cpp
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@nokia.com>2010-10-06 16:26:48 +0200
committerErik Verbruggen <erik.verbruggen@nokia.com>2010-10-08 13:15:21 +0200
commit192ca70649a278e8593bff91151956bc7649ac07 (patch)
treefbc7b82789b6db2bce56d8c858baebd40705465c /src/shared/cplusplus/Parser.cpp
parentac9fc40645638091dcd32bcdbce7d75dc2140825 (diff)
downloadqt-creator-192ca70649a278e8593bff91151956bc7649ac07.tar.gz
C++ Parser: fix infinite loop when recovering from incorrect @selector expression.
Diffstat (limited to 'src/shared/cplusplus/Parser.cpp')
-rw-r--r--src/shared/cplusplus/Parser.cpp12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index eb1b7f7463..414b27fbbd 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -4041,12 +4041,12 @@ bool Parser::parseObjCSelectorExpression(ExpressionAST *&node)
last->value->name_token = identifier_token;
last->value->colon_token = consumeToken();
- while (LA() != T_RPAREN) {
+ while (LA(1) == T_IDENTIFIER && LA(2) == T_COLON) {
last->next = new (_pool) ObjCSelectorArgumentListAST;
last = last->next;
last->value = new (_pool) ObjCSelectorArgumentAST;
- match(T_IDENTIFIER, &last->value->name_token);
- match(T_COLON, &last->value->colon_token);
+ last->value->name_token = consumeToken();
+ last->value->colon_token = consumeToken();
}
} else {
ObjCSelectorAST *args = new (_pool) ObjCSelectorAST;
@@ -4056,7 +4056,13 @@ bool Parser::parseObjCSelectorExpression(ExpressionAST *&node)
args->selector_argument_list->value->name_token = identifier_token;
}
+ if (LA(1) == T_IDENTIFIER && LA(2) == T_RPAREN) {
+ const char *txt = tok(1).spell();
+ consumeToken();
+ error(cursor(), "missing ':' after '%s'", txt);
+ }
match(T_RPAREN, &ast->rparen_token);
+
node = ast;
return true;
}