diff --git a/src/plugins/cppeditor/cppchecksymbols.cpp b/src/plugins/cppeditor/cppchecksymbols.cpp index 52deded323ae5fa240f176823b47383cb88e176a..27126be286da0be9ce75d66f5bc1183118435675 100644 --- a/src/plugins/cppeditor/cppchecksymbols.cpp +++ b/src/plugins/cppeditor/cppchecksymbols.cpp @@ -425,17 +425,18 @@ void CheckSymbols::checkNamespace(NameAST *name) warning(line, column, QCoreApplication::translate("CheckUndefinedSymbols", "Expected a namespace-name"), length); } -void CheckSymbols::checkName(NameAST *ast) +void CheckSymbols::checkName(NameAST *ast, Scope *scope) { if (ast && ast->name) { + if (! scope) + scope = findScope(ast); + if (const Identifier *ident = ast->name->identifier()) { const QByteArray id = QByteArray::fromRawData(ident->chars(), ident->size()); if (_potentialTypes.contains(id)) { - Scope *scope = findScope(ast); const QList<LookupItem> candidates = _context.lookup(ast->name, scope); addUsage(candidates, ast); } else if (_potentialMembers.contains(id)) { - Scope *scope = findScope(ast); const QList<LookupItem> candidates = _context.lookup(ast->name, scope); addMemberUsage(candidates, ast); } @@ -545,6 +546,28 @@ void CheckSymbols::endVisit(TemplateDeclarationAST *) _templateDeclarationStack.takeFirst(); } +bool CheckSymbols::visit(MemInitializerAST *ast) +{ + if (_functionDefinitionStack.isEmpty()) + return false; + + if (ast->name) { + FunctionDefinitionAST *enclosingFunction = _functionDefinitionStack.back(); + if (ClassOrNamespace *binding = _context.lookupType(enclosingFunction->symbol)) { + foreach (Symbol *s, binding->symbols()) { + if (Class *klass = s->asClass()){ + checkName(ast->name, klass->members()); + break; + } + } + } + } + + accept(ast->expression_list); + + return false; +} + bool CheckSymbols::visit(FunctionDefinitionAST *ast) { _functionDefinitionStack.append(ast); diff --git a/src/plugins/cppeditor/cppchecksymbols.h b/src/plugins/cppeditor/cppchecksymbols.h index d7ebfad155e806ed0cca12dac058bc3003cb286a..8b3418fc4584704324bd94b5f953dd660dad1eff 100644 --- a/src/plugins/cppeditor/cppchecksymbols.h +++ b/src/plugins/cppeditor/cppchecksymbols.h @@ -93,7 +93,7 @@ protected: bool warning(unsigned line, unsigned column, const QString &text, unsigned length = 0); bool warning(AST *ast, const QString &text); - void checkName(NameAST *ast); + void checkName(NameAST *ast, Scope *scope = 0); void checkNamespace(NameAST *name); void addUsage(ClassOrNamespace *b, NameAST *ast); void addUsage(const QList<LookupItem> &candidates, NameAST *ast); @@ -123,6 +123,8 @@ protected: virtual bool visit(FunctionDefinitionAST *ast); virtual bool visit(MemberAccessAST *ast); + virtual bool visit(MemInitializerAST *ast); + unsigned startOfTemplateDeclaration(TemplateDeclarationAST *ast) const; Scope *findScope(AST *ast) const; diff --git a/src/plugins/cppeditor/cpplocalsymbols.cpp b/src/plugins/cppeditor/cpplocalsymbols.cpp index 1f5e9f4300b2f5ce0716df4208bd6ca93b7fc74d..fe233d9e01dc602d1ff8aaf728d7646e14d7d70d 100644 --- a/src/plugins/cppeditor/cpplocalsymbols.cpp +++ b/src/plugins/cppeditor/cpplocalsymbols.cpp @@ -155,6 +155,12 @@ protected: return false; } + virtual bool visit(MemInitializerAST *ast) + { + accept(ast->expression_list); + return false; + } + virtual bool visit(TemplateIdAST *ast) { for (TemplateArgumentListAST *arg = ast->template_argument_list; arg; arg = arg->next)