diff options
author | Erik Verbruggen <erik.verbruggen@nokia.com> | 2009-10-19 14:49:51 +0200 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@nokia.com> | 2009-10-19 14:50:20 +0200 |
commit | 077c19a6616b4f828fe497041af010d479c62196 (patch) | |
tree | 224dc4aed5374e2c1799a43161e406733f160be4 /src/shared/cplusplus/Parser.cpp | |
parent | a3c8a39e3fa3b2173806216dc6faf6d10cb26529 (diff) | |
download | qt-creator-077c19a6616b4f828fe497041af010d479c62196.tar.gz |
Fix for invalid parsing of "(a)[b]", including test cases.
Diffstat (limited to 'src/shared/cplusplus/Parser.cpp')
-rw-r--r-- | src/shared/cplusplus/Parser.cpp | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index 958d740a58..d754b234f4 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -2988,15 +2988,30 @@ bool Parser::parseObjCMessageExpression(ExpressionAST *&node) if (LA() != T_LBRACKET) return false; - ObjCMessageExpressionAST *ast = new (_pool) ObjCMessageExpressionAST; - ast->lbracket_token = consumeToken(); + unsigned start = cursor(); - parseObjCMessageReceiver(ast->receiver_expression); - parseObjCMessageArguments(ast->selector, ast->argument_list); + unsigned lbracket_token = consumeToken(); + ExpressionAST *receiver_expression = 0; + ObjCSelectorAST *selector = 0; + ObjCMessageArgumentListAST *argument_list = 0; - match(T_RBRACKET, &(ast->rbracket_token)); - node = ast; - return true; + if (parseObjCMessageReceiver(receiver_expression) && + parseObjCMessageArguments(selector, argument_list)) { + + ObjCMessageExpressionAST *ast = new (_pool) ObjCMessageExpressionAST; + ast->lbracket_token = lbracket_token; + ast->receiver_expression = receiver_expression; + ast->selector = selector; + ast->argument_list = argument_list; + + match(T_RBRACKET, &(ast->rbracket_token)); + node = ast; + + return true; + } + + rewind(start); + return false; } bool Parser::parseObjCMessageReceiver(ExpressionAST *&node) @@ -3051,15 +3066,20 @@ bool Parser::parseObjCMessageArguments(ObjCSelectorAST *&selNode, ObjCMessageArg selNode = selWithArgs; argNode = argAst; + return true; } else { rewind(start); + unsigned name_token = 0; + if (!parseObjCSelector(name_token)) + return false; ObjCSelectorWithoutArgumentsAST *sel = new (_pool) ObjCSelectorWithoutArgumentsAST; - parseObjCSelector(sel->name_token); + sel->name_token = name_token; selNode = sel; argNode = 0; + return true; } - return true; + return false; } bool Parser::parseObjCSelectorArg(ObjCSelectorArgumentAST *&selNode, ObjCMessageArgumentAST *&argNode) |