From 9a8e724f15a8a323299130e90c867f835cbf8ff8 Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Thu, 18 Jun 2009 14:21:28 +0200
Subject: [PATCH] Don't search for undefined symbols in ambiguous typeof
 expressions.

---
 src/plugins/cpptools/cppmodelmanager.cpp | 18 ++++++++++++++++++
 src/shared/cplusplus/AST.h               |  2 ++
 src/shared/cplusplus/Parser.cpp          |  3 ++-
 3 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index b1ed719a365..cf7403953fc 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 5869b1a14d6..bf4da2014a5 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 a2c0d2edda5..d70d8f40d77 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 {
-- 
GitLab