summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus/Parser.cpp
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@nokia.com>2009-10-19 14:49:51 +0200
committerErik Verbruggen <erik.verbruggen@nokia.com>2009-10-19 14:50:20 +0200
commit077c19a6616b4f828fe497041af010d479c62196 (patch)
tree224dc4aed5374e2c1799a43161e406733f160be4 /src/shared/cplusplus/Parser.cpp
parenta3c8a39e3fa3b2173806216dc6faf6d10cb26529 (diff)
downloadqt-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.cpp38
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)