From 30c59e27ad6c47c9ab25ba0a2913eab07ce9de94 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Mon, 24 Sep 2012 14:51:27 +0200 Subject: [PATCH] C++11: Fix parsing of ambiguous declarators. Task-number: QTCREATORBUG-7921 Change-Id: Ia94c30886321e09028547a47f83d2a0c57f3980f Reviewed-by: hjk --- src/libs/3rdparty/cplusplus/AST.h | 1 + src/libs/3rdparty/cplusplus/Parser.cpp | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/libs/3rdparty/cplusplus/AST.h b/src/libs/3rdparty/cplusplus/AST.h index d6c62a3c7dd..c792581d426 100644 --- a/src/libs/3rdparty/cplusplus/AST.h +++ b/src/libs/3rdparty/cplusplus/AST.h @@ -1461,6 +1461,7 @@ public: unsigned ref_qualifier_token; ExceptionSpecificationAST *exception_specification; TrailingReturnTypeAST *trailing_return_type; + // Some FunctionDeclarators can also be interpreted as an initializer, like for 'A b(c);' ExpressionAST *as_cpp_initializer; public: // annotations diff --git a/src/libs/3rdparty/cplusplus/Parser.cpp b/src/libs/3rdparty/cplusplus/Parser.cpp index 2dbbce09394..c2a579af38b 100644 --- a/src/libs/3rdparty/cplusplus/Parser.cpp +++ b/src/libs/3rdparty/cplusplus/Parser.cpp @@ -1491,11 +1491,12 @@ bool Parser::parseDeclarator(DeclaratorAST *&node, SpecifierListAST *decl_specif bool blocked = blockErrors(true); if (parseInitializer(initializer, &node->equal_token)) { - NestedExpressionAST *expr = 0; + // maybe the initializer also parses as a FunctionDeclarator? + ExpressionListParenAST *expr = 0; if (initializer) - expr = initializer->asNestedExpression(); + expr = initializer->asExpressionListParen(); if (expr) { - if (expr->expression && expr->rparen_token && (LA() == T_COMMA || LA() == T_SEMICOLON)) { + if (expr->expression_list && expr->rparen_token && (LA() == T_COMMA || LA() == T_SEMICOLON)) { rewind(lparen_token); // check for ambiguous declarators.