diff options
Diffstat (limited to 'src/shared/cplusplus/Parser.cpp')
-rw-r--r-- | src/shared/cplusplus/Parser.cpp | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index dac159bf22..76ba28264e 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; } |