summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus/Parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared/cplusplus/Parser.cpp')
-rw-r--r--src/shared/cplusplus/Parser.cpp23
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;
}