diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index b1ed719a36532d60bd58de2b35e73aa13cfcf80e..cf7403953fcdce3a02a980150fadd517c0a90340 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -552,6 +552,24 @@ protected:
         return true;
     }
 
+    virtual bool visit(SizeofExpressionAST *ast)
+    {
+        if (ast->lparen_token && ast->expression && ast->rparen_token) {
+            if (TypeIdAST *type_id = ast->expression->asTypeId()) {
+                SpecifierAST *type_specifier = type_id->type_specifier;
+                if (! type_id->declarator && type_specifier && ! type_specifier->next &&
+                    type_specifier->asNamedTypeSpecifier()) {
+                    // this sizeof expression is ambiguos, e.g.
+                    // sizeof (a)
+                    //   `a' can be a typeid or a nested-expression.
+                    return false;
+                }
+            }
+        }
+
+        return true;
+    }
+
     LookupContext lookupContext(unsigned line, unsigned column) const;
 
 private:
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index 5869b1a14d67b9c8bbf1b37a41748d99ece86694..bf4da2014a5815e152796ce2beb5468f89cc3d98 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -1980,7 +1980,9 @@ class CPLUSPLUS_EXPORT SizeofExpressionAST: public ExpressionAST
 {
 public:
     unsigned sizeof_token;
+    unsigned lparen_token;
     ExpressionAST *expression;
+    unsigned rparen_token;
 
 public:
     virtual SizeofExpressionAST *asSizeofExpression()
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index a2c0d2edda566dd53c1bbd316c9561a92a393465..d70d8f40d771034f2652a477e081b3e5b38aa2f4 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -3158,7 +3158,8 @@ bool Parser::parseUnaryExpression(ExpressionAST *&node)
         if (LA() == T_LPAREN) {
             unsigned lparen_token = consumeToken();
             if (parseTypeId(ast->expression) && LA() == T_RPAREN) {
-                consumeToken();
+                ast->lparen_token = lparen_token;
+                ast->rparen_token = consumeToken();
                 node = ast;
                 return true;
             } else {