diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 9ec965e3f46..d007b858e15 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -4483,8 +4483,8 @@ void Function::addArguments(const Scope *scope) nameTok = tok->tokAt(2); endTok = nameTok->previous(); tok = tok->link(); - } else if (tok != startTok && !nameTok && Token::Match(tok, "( * %var% ) (") && Token::Match(tok->link()->linkAt(1), ") [,)]")) { - nameTok = tok->tokAt(2); + } else if (tok != startTok && !nameTok && Token::Match(tok, "( * const| %var% ) (") && Token::Match(tok->link()->linkAt(1), ") [,)]")) { + nameTok = tok->link()->previous(); endTok = nameTok->previous(); tok = tok->link()->linkAt(1); } else if (tok != startTok && !nameTok && Token::Match(tok, "( * %var% ) [")) { diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index b87933ed1f9..147f53b257f 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -304,6 +304,7 @@ class TestSymbolDatabase : public TestFixture { TEST_CASE(functionArgs19); // #10376 TEST_CASE(functionArgs20); TEST_CASE(functionArgs21); + TEST_CASE(functionArgs22); // #13945 TEST_CASE(functionImplicitlyVirtual); TEST_CASE(functionGetOverridden); @@ -3064,6 +3065,22 @@ class TestSymbolDatabase : public TestFixture { ASSERT_EQUALS("", arg->name()); } + void functionArgs22() { + const char code[] = "typedef void (*callback_fn)(void);\n" + "void ext_func(const callback_fn cb, size_t v) {}\n"; + GET_SYMBOL_DB(code); + ASSERT(db != nullptr); + ASSERT_EQUALS(1U, db->functionScopes.size()); + const auto it = db->functionScopes.cbegin(); + const Function *func = (*it)->function; + ASSERT_EQUALS("ext_func", func->name()); + ASSERT_EQUALS(2, func->argCount()); + const Variable *arg = func->getArgumentVar(0); + ASSERT_EQUALS("cb", arg->name()); + arg = func->getArgumentVar(1); + ASSERT_EQUALS("v", arg->name()); + } + void functionImplicitlyVirtual() { GET_SYMBOL_DB("class base { virtual void f(); };\n" "class derived : base { void f(); };\n"