summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus/Parser.cpp
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2009-06-19 11:59:26 +0200
committerRoberto Raggi <roberto.raggi@nokia.com>2009-06-19 11:59:26 +0200
commit0c03c1b9f9ca956ed9e92c2c60409c83b2503ddb (patch)
treea6a343446709ea08a45134aafed1bc7fb809442c /src/shared/cplusplus/Parser.cpp
parentb4a27f699511a546b78ad0f5464ee2f3d66ce367 (diff)
downloadqt-creator-0c03c1b9f9ca956ed9e92c2c60409c83b2503ddb.tar.gz
Fixed template-id vs binary expression followed by a C-cast expression ambiguity.
Diffstat (limited to 'src/shared/cplusplus/Parser.cpp')
-rw-r--r--src/shared/cplusplus/Parser.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index b65d9fc4e4..e987d4d2fc 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -2924,6 +2924,31 @@ bool Parser::parseNameId(NameAST *&name)
if (! parseName(name))
return false;
+ TemplateIdAST *template_id = name->asTemplateId();
+ if (LA() == T_LPAREN && template_id) {
+ if (TemplateArgumentListAST *template_arguments = template_id->template_arguments) {
+ if (! template_arguments->next && template_arguments->template_argument && template_arguments->template_argument->asBinaryExpression()) {
+ unsigned saved = cursor();
+ ExpressionAST *expr = 0;
+ bool blocked = blockErrors(true);
+ if (parseCastExpression(expr)) {
+ (void) blockErrors(blocked);
+
+ if (CastExpressionAST *cast_expression = expr->asCastExpression()) {
+ if (cast_expression->lparen_token && cast_expression->rparen_token
+ && cast_expression->type_id && cast_expression->expression) {
+ rewind(start);
+
+ name = 0;
+ return parseName(name, false);
+ }
+ }
+ }
+ rewind(saved);
+ }
+ }
+ }
+
if (LA() == T_IDENTIFIER ||
LA() == T_STATIC_CAST ||
LA() == T_DYNAMIC_CAST ||