From 0c03c1b9f9ca956ed9e92c2c60409c83b2503ddb Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Fri, 19 Jun 2009 11:59:26 +0200
Subject: [PATCH] Fixed template-id vs binary expression followed by a C-cast
 expression ambiguity.

---
 src/shared/cplusplus/Parser.cpp | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index b65d9fc4e4a..e987d4d2fc0 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 ||
-- 
GitLab