diff options
author | Roberto Raggi <roberto.raggi@nokia.com> | 2009-06-19 11:59:26 +0200 |
---|---|---|
committer | Roberto Raggi <roberto.raggi@nokia.com> | 2009-06-19 11:59:26 +0200 |
commit | 0c03c1b9f9ca956ed9e92c2c60409c83b2503ddb (patch) | |
tree | a6a343446709ea08a45134aafed1bc7fb809442c /src/shared/cplusplus/Parser.cpp | |
parent | b4a27f699511a546b78ad0f5464ee2f3d66ce367 (diff) | |
download | qt-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.cpp | 25 |
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 || |