From da6614ce6dcf9759779bcb314aa7195f8324db26 Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Thu, 18 Jun 2009 12:58:06 +0200
Subject: [PATCH] Don't check for undefined symbols in ambiguous ast nodes.

---
 src/plugins/cpptools/cppmodelmanager.cpp | 28 ++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index e8110c54dae..b00596df85c 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -529,6 +529,34 @@ protected:
         return true;
     }
 
+    virtual bool visit(BinaryExpressionAST *ast)
+    {
+        if (ast->right_expression) {
+            if (CastExpressionAST *right_cast_expr = ast->right_expression->asCastExpression()) {
+                if (right_cast_expr->type_id) {
+                    if (TypeIdAST *right_cast_type_id = right_cast_expr->type_id->asTypeId()) {
+                        SpecifierAST *type_specifier = right_cast_type_id->type_specifier;
+                        if (! right_cast_type_id->declarator && type_specifier && ! type_specifier->next &&
+                                type_specifier->asNamedTypeSpecifier() && right_cast_expr->expression &&
+                                right_cast_expr->expression->asUnaryExpression()) {
+                            // this ast node is ambigious, e.g.
+                            //   1 + (a) + b
+                            // it can be parsed as
+                            //   1 + ((a) + b)
+                            // or
+                            //   1 + (a) (+b)
+                            accept(ast->left_expression);
+                            accept(right_cast_expr->expression);
+                            return false;
+                        }
+                    }
+                }
+            }
+        }
+
+        return true;
+    }
+
     LookupContext lookupContext(unsigned line, unsigned column) const;
 
 private:
-- 
GitLab