From 5eeeba97eba6f32acc91ace3b355ac8f6c3bf6fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sat, 2 May 2020 17:04:54 +0200 Subject: [PATCH] SymbolDatabase: Better handling of function pointer function argument --- lib/symboldatabase.cpp | 4 ++++ test/testsymboldatabase.cpp | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 359413602..9be17d093 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -3500,6 +3500,10 @@ void Function::addArguments(const SymbolDatabase *symbolDatabase, const Scope *s nameTok = tok->tokAt(2); endTok = nameTok->previous(); tok = tok->link(); + } else if (tok != startTok && !nameTok && Token::Match(tok, "( * %var% ) ( ) [,)]")) { + nameTok = tok->tokAt(2); + endTok = nameTok->previous(); + tok = tok->link()->tokAt(2); } else if (tok->varId() != 0) { nameTok = tok; endTok = tok->previous(); diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 89253e633..61f32e1bd 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -228,6 +228,7 @@ private: TEST_CASE(functionArgs14); // #9055 TEST_CASE(functionArgs15); // #7159 TEST_CASE(functionArgs16); // #9591 + TEST_CASE(functionArgs17); TEST_CASE(functionImplicitlyVirtual); @@ -2386,6 +2387,15 @@ private: ASSERT(arg2->isReference()); } + void functionArgs17() { + const char code[] = "void f(int (*fp)(), int x, int y) {}"; + GET_SYMBOL_DB(code); + ASSERT(db != nullptr); + const Scope *scope = db->functionScopes.front(); + const Function *func = scope->function; + ASSERT_EQUALS(3, func->argCount()); + } + void functionImplicitlyVirtual() { GET_SYMBOL_DB("class base { virtual void f(); };\n" "class derived : base { void f(); };\n"