From 79fc332511563f98dd06b660b8e288a9974e9241 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Thu, 17 Nov 2016 22:45:50 +0100 Subject: [PATCH] Fixed #7810 (SymbolDatabase: method with redundant scope info) --- lib/symboldatabase.cpp | 2 +- test/testsymboldatabase.cpp | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index e587b0440..ac8a79d1e 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -355,7 +355,7 @@ SymbolDatabase::SymbolDatabase(const Tokenizer *tokenizer, const Settings *setti // class function? else if (isFunction(tok, scope, &funcStart, &argStart, &declEnd)) { - if (tok->previous()->str() != "::") { + if (tok->previous()->str() != "::" || tok->strAt(-2) == scope->className) { Function function; // save the function definition argument start '(' diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 2c9f550d4..b1153775b 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -152,6 +152,7 @@ private: TEST_CASE(hasInlineClassFunctionReturningFunctionPointer); TEST_CASE(hasMissingInlineClassFunctionReturningFunctionPointer); TEST_CASE(hasClassFunctionReturningFunctionPointer); + TEST_CASE(methodWithRedundantScope); TEST_CASE(complexFunctionArrayPtr); TEST_CASE(pointerToMemberFunction); TEST_CASE(hasSubClassConstructor); @@ -1120,6 +1121,27 @@ private: } } + void methodWithRedundantScope() { + GET_SYMBOL_DB("class Fred { void Fred::func() {} };\n") + + // 3 scopes: Global, Class, and Function + ASSERT(db && db->scopeList.size() == 3); + + if (db) { + const Token * const functionToken = Token::findsimplematch(tokenizer.tokens(), "func"); + + const Scope *scope = findFunctionScopeByToken(db, functionToken); + + ASSERT(scope && scope->className == "func"); + + const Function *function = findFunctionByName("func", &db->scopeList.back()); + + ASSERT(function && function->token->str() == "func"); + ASSERT(function && function->token == functionToken); + ASSERT(function && function->hasBody() && function->isInline()); + } + } + void complexFunctionArrayPtr() { GET_SYMBOL_DB("int(*p1)[10]; \n" // pointer to array 10 of int "void(*p2)(char); \n" // pointer to function (char) returning void