Skip to content

Commit e30978d

Browse files
authored
fix #13945: SymbolDatabase: function 'void ext_func(const callback_fn cb, size_t v)' has 2 arguments (danmar#7605)
1 parent 43adf75 commit e30978d

File tree

2 files changed

+19
-2
lines changed

2 files changed

+19
-2
lines changed

lib/symboldatabase.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4483,8 +4483,8 @@ void Function::addArguments(const Scope *scope)
44834483
nameTok = tok->tokAt(2);
44844484
endTok = nameTok->previous();
44854485
tok = tok->link();
4486-
} else if (tok != startTok && !nameTok && Token::Match(tok, "( * %var% ) (") && Token::Match(tok->link()->linkAt(1), ") [,)]")) {
4487-
nameTok = tok->tokAt(2);
4486+
} else if (tok != startTok && !nameTok && Token::Match(tok, "( * const| %var% ) (") && Token::Match(tok->link()->linkAt(1), ") [,)]")) {
4487+
nameTok = tok->link()->previous();
44884488
endTok = nameTok->previous();
44894489
tok = tok->link()->linkAt(1);
44904490
} else if (tok != startTok && !nameTok && Token::Match(tok, "( * %var% ) [")) {

test/testsymboldatabase.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,7 @@ class TestSymbolDatabase : public TestFixture {
304304
TEST_CASE(functionArgs19); // #10376
305305
TEST_CASE(functionArgs20);
306306
TEST_CASE(functionArgs21);
307+
TEST_CASE(functionArgs22); // #13945
307308

308309
TEST_CASE(functionImplicitlyVirtual);
309310
TEST_CASE(functionGetOverridden);
@@ -3064,6 +3065,22 @@ class TestSymbolDatabase : public TestFixture {
30643065
ASSERT_EQUALS("", arg->name());
30653066
}
30663067

3068+
void functionArgs22() {
3069+
const char code[] = "typedef void (*callback_fn)(void);\n"
3070+
"void ext_func(const callback_fn cb, size_t v) {}\n";
3071+
GET_SYMBOL_DB(code);
3072+
ASSERT(db != nullptr);
3073+
ASSERT_EQUALS(1U, db->functionScopes.size());
3074+
const auto it = db->functionScopes.cbegin();
3075+
const Function *func = (*it)->function;
3076+
ASSERT_EQUALS("ext_func", func->name());
3077+
ASSERT_EQUALS(2, func->argCount());
3078+
const Variable *arg = func->getArgumentVar(0);
3079+
ASSERT_EQUALS("cb", arg->name());
3080+
arg = func->getArgumentVar(1);
3081+
ASSERT_EQUALS("v", arg->name());
3082+
}
3083+
30673084
void functionImplicitlyVirtual() {
30683085
GET_SYMBOL_DB("class base { virtual void f(); };\n"
30693086
"class derived : base { void f(); };\n"

0 commit comments

Comments
 (0)