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