diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 91e1e4215..6da6641d5 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -1358,6 +1358,9 @@ bool SymbolDatabase::isFunction(const Token *tok, const Scope* outerScope, const const Token* tok1 = tok->previous(); const Token* tok2 = tok->next()->link()->next(); + if (!_tokenizer->isFunctionHead(tok->next(), ";:{")) + return false; + // skip over destructor "~" if (tok1->str() == "~") tok1 = tok1->previous(); diff --git a/lib/symboldatabase.h b/lib/symboldatabase.h index d924055ae..2dfe98a00 100644 --- a/lib/symboldatabase.h +++ b/lib/symboldatabase.h @@ -1109,6 +1109,7 @@ public: class CPPCHECKLIB SymbolDatabase { + friend class TestSymbolDatabase; public: SymbolDatabase(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger); ~SymbolDatabase(); diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 8b9b8ae43..4e4402036 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -296,7 +296,8 @@ private: TEST_CASE(isImplicitlyVirtual); TEST_CASE(isPure); - TEST_CASE(isFunction); // UNKNOWN_MACRO(a,b) { .. } + TEST_CASE(isFunction1); // UNKNOWN_MACRO(a,b) { .. } + TEST_CASE(isFunction2); TEST_CASE(findFunction1); TEST_CASE(findFunction2); // mismatch: parameter passed by address => reference argument @@ -3745,7 +3746,8 @@ private: ASSERT(!(it++)->isPure()); } } - void isFunction() { // #5602 - UNKNOWN_MACRO(a,b) { .. } + + void isFunction1() { // #5602 - UNKNOWN_MACRO(a,b) { .. } GET_SYMBOL_DB("TEST(a,b) {\n" " std::vector messages;\n" " foo(messages[2].size());\n" @@ -3758,6 +3760,25 @@ private: var->typeStartToken()->str() == "std"); } + void isFunction2() { + GET_SYMBOL_DB("void set_cur_cpu_spec()\n" + "{\n" + " t = PTRRELOC(t);\n" + "}\n" + "\n" + "cpu_spec * __init setup_cpu_spec()\n" + "{\n" + " t = PTRRELOC(t);\n" + " *PTRRELOC(&x) = &y;\n" + "}"); + ASSERT(db != nullptr); + ASSERT(db && !db->isFunction(Token::findsimplematch(tokenizer.tokens(), "PTRRELOC ( &"), &db->scopeList.back(), nullptr, nullptr, nullptr)); + ASSERT(db->findScopeByName("set_cur_cpu_spec") != nullptr); + // TODO: ASSERT(db->findScopeByName("setup_cpu_spec") != nullptr); + ASSERT(db->findScopeByName("PTRRELOC") == nullptr); + } + + void findFunction1() { GET_SYMBOL_DB("int foo(int x);\n" /* 1 */ "void foo();\n" /* 2 */