diff --git a/shared/cplusplus/Parser.cpp b/shared/cplusplus/Parser.cpp
index eefa3d5b9fe978bdcc6ecc7b4c1fcfcfa8c174e7..f1b057d31cae7d9202de3a0862f73246eb56490e 100644
--- a/shared/cplusplus/Parser.cpp
+++ b/shared/cplusplus/Parser.cpp
@@ -2556,24 +2556,12 @@ bool Parser::parsePrimaryExpression(ExpressionAST *&node)
         return parseQtMethod(node);
 
     default: {
-        unsigned startOfName = cursor();
         NameAST *name = 0;
-        if (parseName(name)) {
-            if (LA() == T_IDENTIFIER || tok().isLiteral() || (tok().isOperator() && LA() != T_LPAREN &&
-                                                              LA() != T_LBRACKET)) {
-                rewind(startOfName);
-                parseName(name, false);
-            }
-            // literal
-            // identifier <unop> ?
-            // identifier <binop>
-            // identifier <access>
-            // identifier rparen
-            // lparen type rparen identifier  [[cast-expression]]
-
+        if (parseNameId(name)) {
             node = name;
             return true;
         }
+        break;
     } // default
 
     } // switch
@@ -2581,6 +2569,23 @@ bool Parser::parsePrimaryExpression(ExpressionAST *&node)
     return false;
 }
 
+bool Parser::parseNameId(NameAST *&name)
+{
+    unsigned start = cursor();
+    if (! parseName(name))
+        return false;
+
+    if (LA() == T_IDENTIFIER ||
+        tok().isLiteral()    ||
+        (tok().isOperator() && LA() != T_LPAREN && LA() != T_LBRACKET))
+    {
+        rewind(start);
+        return parseName(name, false);
+    }
+
+    return false;
+}
+
 bool Parser::parseNestedExpression(ExpressionAST *&node)
 {
     if (LA() == T_LPAREN) {
@@ -2763,7 +2768,7 @@ bool Parser::parsePostfixExpression(ExpressionAST *&node)
                 ast->access_token = consumeToken();
                 if (LA() == T_TEMPLATE)
                     ast->template_token = consumeToken();
-                if (! parseName(ast->member_name))
+                if (! parseNameId(ast->member_name))
                     _translationUnit->error(cursor(), "expected unqualified-id before token `%s'",
                                             tok().spell());
                 *postfix_ptr = ast;
diff --git a/shared/cplusplus/Parser.h b/shared/cplusplus/Parser.h
index 75fad457fad38efb7fb173f4496e169adeca7bcd..d99d8d27fc0a395344cb6287138d986561b24f13 100644
--- a/shared/cplusplus/Parser.h
+++ b/shared/cplusplus/Parser.h
@@ -141,6 +141,7 @@ public:
     bool parseMultiplicativeExpression(ExpressionAST *&node);
     bool parseTemplateId(NameAST *&node);
     bool parseClassOrNamespaceName(NameAST *&node);
+    bool parseNameId(NameAST *&node);
     bool parseName(NameAST *&node, bool acceptTemplateId = true);
     bool parseNestedNameSpecifier(NestedNameSpecifierAST *&node, bool acceptTemplateId);
     bool parseNestedNameSpecifierOpt(NestedNameSpecifierAST *&name, bool acceptTemplateId);