Co-authored-by: Robert Reif <reif@FX6840>
This commit is contained in:
parent
76d5e6c7db
commit
23da5c9815
|
@ -4617,7 +4617,8 @@ void Scope::findFunctionInBase(const std::string & name, nonneg int args, std::v
|
|||
|
||||
for (std::multimap<std::string, const Function *>::const_iterator it = base->classScope->functionMap.find(name); it != base->classScope->functionMap.end() && it->first == name; ++it) {
|
||||
const Function *func = it->second;
|
||||
if (args == func->argCount() || (args < func->argCount() && args >= func->minArgCount())) {
|
||||
if ((func->isVariadic() && args >= (func->argCount() - 1)) ||
|
||||
(args == func->argCount() || (args < func->argCount() && args >= func->minArgCount()))) {
|
||||
matches.push_back(func);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -395,6 +395,7 @@ private:
|
|||
TEST_CASE(findFunction30);
|
||||
TEST_CASE(findFunction31);
|
||||
TEST_CASE(findFunction32); // C: relax type matching
|
||||
TEST_CASE(findFunction33); // #9885 variadic function
|
||||
TEST_CASE(findFunctionContainer);
|
||||
TEST_CASE(findFunctionExternC);
|
||||
TEST_CASE(findFunctionGlobalScope); // ::foo
|
||||
|
@ -6065,6 +6066,129 @@ private:
|
|||
ASSERT_EQUALS(1, foo->function()->tokenDef->linenr());
|
||||
}
|
||||
|
||||
void findFunction33() {
|
||||
{
|
||||
GET_SYMBOL_DB("class Base {\n"
|
||||
" int i{};\n"
|
||||
"public:\n"
|
||||
" void foo(...) const { bar(); }\n"
|
||||
" int bar() const { return i; }\n"
|
||||
"};\n"
|
||||
"class Derived : public Base {\n"
|
||||
"public:\n"
|
||||
" void doIt() const {\n"
|
||||
" foo();\n"
|
||||
" }\n"
|
||||
"};");
|
||||
(void)db;
|
||||
const Token *foo = Token::findsimplematch(tokenizer.tokens(), "foo ( ) ;");
|
||||
ASSERT(foo);
|
||||
ASSERT(foo->function());
|
||||
ASSERT(foo->function()->tokenDef);
|
||||
ASSERT_EQUALS(4, foo->function()->tokenDef->linenr());
|
||||
}
|
||||
{
|
||||
GET_SYMBOL_DB("class Base {\n"
|
||||
" int i{};\n"
|
||||
"public:\n"
|
||||
" void foo(...) const { bar(); }\n"
|
||||
" int bar() const { return i; }\n"
|
||||
"};\n"
|
||||
"class Derived : public Base {\n"
|
||||
"public:\n"
|
||||
" void doIt() const {\n"
|
||||
" foo(1);\n"
|
||||
" }\n"
|
||||
"};");
|
||||
(void)db;
|
||||
const Token *foo = Token::findsimplematch(tokenizer.tokens(), "foo ( 1 ) ;");
|
||||
ASSERT(foo);
|
||||
ASSERT(foo->function());
|
||||
ASSERT(foo->function()->tokenDef);
|
||||
ASSERT_EQUALS(4, foo->function()->tokenDef->linenr());
|
||||
}
|
||||
{
|
||||
GET_SYMBOL_DB("class Base {\n"
|
||||
" int i{};\n"
|
||||
"public:\n"
|
||||
" void foo(...) const { bar(); }\n"
|
||||
" int bar() const { return i; }\n"
|
||||
"};\n"
|
||||
"class Derived : public Base {\n"
|
||||
"public:\n"
|
||||
" void doIt() const {\n"
|
||||
" foo(1,2);\n"
|
||||
" }\n"
|
||||
"};");
|
||||
(void)db;
|
||||
const Token *foo = Token::findsimplematch(tokenizer.tokens(), "foo ( 1 , 2 ) ;");
|
||||
ASSERT(foo);
|
||||
ASSERT(foo->function());
|
||||
ASSERT(foo->function()->tokenDef);
|
||||
ASSERT_EQUALS(4, foo->function()->tokenDef->linenr());
|
||||
}
|
||||
{
|
||||
GET_SYMBOL_DB("class Base {\n"
|
||||
" int i{};\n"
|
||||
"public:\n"
|
||||
" void foo(int, ...) const { bar(); }\n"
|
||||
" int bar() const { return i; }\n"
|
||||
"};\n"
|
||||
"class Derived : public Base {\n"
|
||||
"public:\n"
|
||||
" void doIt() const {\n"
|
||||
" foo(1);\n"
|
||||
" }\n"
|
||||
"};");
|
||||
(void)db;
|
||||
const Token *foo = Token::findsimplematch(tokenizer.tokens(), "foo ( 1 ) ;");
|
||||
ASSERT(foo);
|
||||
ASSERT(foo->function());
|
||||
ASSERT(foo->function()->tokenDef);
|
||||
ASSERT_EQUALS(4, foo->function()->tokenDef->linenr());
|
||||
}
|
||||
{
|
||||
GET_SYMBOL_DB("class Base {\n"
|
||||
" int i{};\n"
|
||||
"public:\n"
|
||||
" void foo(int,...) const { bar(); }\n"
|
||||
" int bar() const { return i; }\n"
|
||||
"};\n"
|
||||
"class Derived : public Base {\n"
|
||||
"public:\n"
|
||||
" void doIt() const {\n"
|
||||
" foo(1,2);\n"
|
||||
" }\n"
|
||||
"};");
|
||||
(void)db;
|
||||
const Token *foo = Token::findsimplematch(tokenizer.tokens(), "foo ( 1 , 2 ) ;");
|
||||
ASSERT(foo);
|
||||
ASSERT(foo->function());
|
||||
ASSERT(foo->function()->tokenDef);
|
||||
ASSERT_EQUALS(4, foo->function()->tokenDef->linenr());
|
||||
}
|
||||
{
|
||||
GET_SYMBOL_DB("class Base {\n"
|
||||
" int i{};\n"
|
||||
"public:\n"
|
||||
" void foo(int,...) const { bar(); }\n"
|
||||
" int bar() const { return i; }\n"
|
||||
"};\n"
|
||||
"class Derived : public Base {\n"
|
||||
"public:\n"
|
||||
" void doIt() const {\n"
|
||||
" foo(1, 2, 3);\n"
|
||||
" }\n"
|
||||
"};");
|
||||
(void)db;
|
||||
const Token *foo = Token::findsimplematch(tokenizer.tokens(), "foo ( 1 , 2 , 3 ) ;");
|
||||
ASSERT(foo);
|
||||
ASSERT(foo->function());
|
||||
ASSERT(foo->function()->tokenDef);
|
||||
ASSERT_EQUALS(4, foo->function()->tokenDef->linenr());
|
||||
}
|
||||
}
|
||||
|
||||
void findFunctionContainer() {
|
||||
{
|
||||
GET_SYMBOL_DB("void dostuff(std::vector<int> v);\n"
|
||||
|
|
Loading…
Reference in New Issue