diff --git a/src/plugins/cppeditor/cpplocalsymbols.cpp b/src/plugins/cppeditor/cpplocalsymbols.cpp index 94da2211271..622708af61d 100644 --- a/src/plugins/cppeditor/cpplocalsymbols.cpp +++ b/src/plugins/cppeditor/cpplocalsymbols.cpp @@ -106,15 +106,15 @@ protected: } } - virtual bool visit(IdExpressionAST *ast) + bool checkLocalUse(NameAST *nameAst, unsigned firstToken) { - if (SimpleNameAST *simpleName = ast->name->asSimpleName()) { + if (SimpleNameAST *simpleName = nameAst->asSimpleName()) { const Identifier *id = identifier(simpleName->identifier_token); for (int i = _scopeStack.size() - 1; i != -1; --i) { if (Symbol *member = _scopeStack.at(i)->find(id)) { - if (member->isTypedef()) + if (member->isTypedef() || !member->isDeclaration()) continue; - else if (!member->isGenerated() && (member->sourceLocation() < ast->firstToken() || member->enclosingScope()->isFunction())) { + else if (!member->isGenerated() && (member->sourceLocation() < firstToken || member->enclosingScope()->isFunction())) { unsigned line, column; getTokenStartPosition(simpleName->identifier_token, &line, &column); localUses[member].append(SemanticInfo::Use(line, column, id->size(), SemanticInfo::LocalUse)); @@ -127,6 +127,26 @@ protected: return true; } + virtual bool visit(IdExpressionAST *ast) + { + return checkLocalUse(ast->name, ast->firstToken()); + } + + virtual bool visit(SizeofExpressionAST *ast) + { + if (ast->expression && ast->expression->asTypeId()) { + TypeIdAST *typeId = ast->expression->asTypeId(); + if (!typeId->declarator && typeId->type_specifier_list && !typeId->type_specifier_list->next) { + if (NamedTypeSpecifierAST *namedTypeSpec = typeId->type_specifier_list->value->asNamedTypeSpecifier()) { + if (checkLocalUse(namedTypeSpec->name, namedTypeSpec->firstToken())) + return false; + } + } + } + + return true; + } + virtual bool visit(QtMemberDeclarationAST *ast) { if (tokenKind(ast->q_token) == T_Q_D)