From e3baca2e9a5f2415bf7f0e02d8803e6119577f6c Mon Sep 17 00:00:00 2001 From: Roberto Raggi <roberto.raggi@nokia.com> Date: Tue, 17 Mar 2009 14:12:18 +0100 Subject: [PATCH] Prefer C++ Initializer when parsing init-declarators. --- src/shared/cplusplus/Parser.cpp | 23 +++++++++++++++++++++-- src/shared/cplusplus/Parser.h | 2 +- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index dac159bf22b..76ba28264ee 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -977,7 +977,7 @@ bool Parser::parseCoreDeclarator(DeclaratorAST *&node) return false; } -bool Parser::parseDeclarator(DeclaratorAST *&node) +bool Parser::parseDeclarator(DeclaratorAST *&node, bool stopAtCppInitializer) { if (! parseCoreDeclarator(node)) return false; @@ -988,6 +988,25 @@ bool Parser::parseDeclarator(DeclaratorAST *&node) unsigned startOfPostDeclarator = cursor(); if (LA() == T_LPAREN) { + if (stopAtCppInitializer) { + unsigned lparen_token = cursor(); + ExpressionAST *initializer = 0; + + bool blocked = blockErrors(true); + if (parseInitializer(initializer)) { + if (NestedExpressionAST *expr = initializer->asNestedExpression()) { + if (expr->expression && expr->rparen_token && (LA() == T_COMMA || LA() == T_SEMICOLON)) { + rewind(lparen_token); + blockErrors(blocked); + return true; + } + } + } + + blockErrors(blocked); + rewind(lparen_token); + } + FunctionDeclaratorAST *ast = new (_pool) FunctionDeclaratorAST; ast->lparen_token = consumeToken(); parseParameterDeclarationClause(ast->parameters); @@ -1494,7 +1513,7 @@ bool Parser::parseInitDeclarator(DeclaratorAST *&node, if (acceptStructDeclarator && LA() == T_COLON) { // anonymous bit-field declaration. // ### TODO create the AST - } else if (! parseDeclarator(node)) { + } else if (! parseDeclarator(node, /*stopAtCppInitializer = */ ! acceptStructDeclarator)) { return false; } diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h index 638c1147bdd..b2d55f3868f 100644 --- a/src/shared/cplusplus/Parser.h +++ b/src/shared/cplusplus/Parser.h @@ -107,7 +107,7 @@ public: bool parseSimpleDeclaration(DeclarationAST *&node, bool acceptStructDeclarator = false); bool parseDeclarationStatement(StatementAST *&node); bool parseCoreDeclarator(DeclaratorAST *&node); - bool parseDeclarator(DeclaratorAST *&node); + bool parseDeclarator(DeclaratorAST *&node, bool stopAtCppInitializer = false); bool parseDeleteExpression(ExpressionAST *&node); bool parseDoStatement(StatementAST *&node); bool parseElaboratedTypeSpecifier(SpecifierAST *&node); -- GitLab