diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index d393d0181..a124f4f4f 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -4151,10 +4151,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% ) ( ) [,)]")) { + } else if (tok != startTok && !nameTok && Token::Match(tok, "( * %var% ) (") && Token::Match(tok->link()->linkAt(1), ") [,)]")) { nameTok = tok->tokAt(2); endTok = nameTok->previous(); - tok = tok->link()->tokAt(2); + tok = tok->link()->linkAt(1); } else if (tok != startTok && !nameTok && Token::Match(tok, "( * %var% ) [")) { nameTok = tok->tokAt(2); endTok = nameTok->previous(); diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 6fb6562f9..72d5aa75c 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -254,6 +254,7 @@ private: TEST_CASE(functionArgs16); // #9591 TEST_CASE(functionArgs17); TEST_CASE(functionArgs18); // #10376 + TEST_CASE(functionArgs19); // #10376 TEST_CASE(functionImplicitlyVirtual); @@ -2670,6 +2671,15 @@ private: ASSERT_EQUALS(2, func->argCount()); } + void functionArgs19() { + const char code[] = "void f(int (*fp)(int), 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"