diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index bcf8a3ac68a..3356b91abd4 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -6018,7 +6018,9 @@ const Function* Scope::findFunction(const Token *tok, bool requireConst, Referen matches.erase(itPure); // Only one candidate left - if (matches.size() == 1) + if (matches.size() == 1 && std::none_of(functionList.begin(), functionList.end(), [tok](const Function& f) { + return startsWith(f.name(), tok->str() + " <"); + })) return matches[0]; // Prioritize matches in derived scopes diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 7990f4ce7d9..b40f4c5d88e 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -527,6 +527,7 @@ class TestSymbolDatabase : public TestFixture { TEST_CASE(findFunction57); TEST_CASE(findFunction58); // #13310 TEST_CASE(findFunction59); + TEST_CASE(findFunction60); TEST_CASE(findFunctionRef1); TEST_CASE(findFunctionRef2); // #13328 TEST_CASE(findFunctionContainer); @@ -8573,6 +8574,26 @@ class TestSymbolDatabase : public TestFixture { ASSERT_EQUALS(foo->function()->tokenDef->linenr(), 1); } + void findFunction60() { // #12910 + GET_SYMBOL_DB("template \n" + "void fun(T& t, bool x = false) {\n" + " t.push_back(0);\n" + "}\n" + "template \n" + "void fun(bool x = false) {\n" + " T t;\n" + " fun(t, x);\n" + "}\n" + "int f() {\n" + " fun>(true);\n" + " std::vector v;\n" + " fun(v);\n" + " return v.back();\n" + "}\n"); + const Token* fun = Token::findsimplematch(tokenizer.tokens(), "fun ( v"); + ASSERT(fun && !fun->function()); + } + void findFunctionRef1() { GET_SYMBOL_DB("struct X {\n" " const std::vector getInts() const & { return mInts; }\n"