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 {