diff options
author | Erik Verbruggen <erik.verbruggen@nokia.com> | 2010-10-06 16:26:48 +0200 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@nokia.com> | 2010-10-08 13:15:21 +0200 |
commit | 192ca70649a278e8593bff91151956bc7649ac07 (patch) | |
tree | fbc7b82789b6db2bce56d8c858baebd40705465c /src/shared/cplusplus/Parser.cpp | |
parent | ac9fc40645638091dcd32bcdbce7d75dc2140825 (diff) | |
download | qt-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.cpp | 12 |
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; } |