diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index dac159bf22b2c08e973d92b44499fca666b9d080..76ba28264ee93ed4a1bd23cfd2f32730408742d8 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 638c1147bdd54a54644ae44d19cefb128e7e5dfc..b2d55f3868fe4ac6750740b390054d3700e2a5c9 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);