From 5b82d8ec274e2fff7132d711ead9b1e45bc69d60 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Thu, 10 Apr 2025 21:15:02 +0200 Subject: [PATCH 1/3] Fix #12910 FP containerOutOfBounds with overloaded template function --- lib/symboldatabase.cpp | 5 ++++- test/testsymboldatabase.cpp | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index bcf8a3ac68a..c49f3bdeae0 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -6018,7 +6018,10 @@ 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) { + const auto nTok = tok->str().size(); + return startsWith(f.name(), tok->str()) && f.name().size() > nTok + 2 && f.name()[nTok + 1] == '<'; + })) return matches[0]; // Prioritize matches in derived scopes diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 7990f4ce7d9..5f668558deb 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" From bfa22193b597ab7068e2606c08335b68dfe131a7 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Thu, 10 Apr 2025 21:52:27 +0200 Subject: [PATCH 2/3] Format --- test/testsymboldatabase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 5f668558deb..b40f4c5d88e 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -8577,7 +8577,7 @@ class TestSymbolDatabase : public TestFixture { void findFunction60() { // #12910 GET_SYMBOL_DB("template \n" "void fun(T& t, bool x = false) {\n" - " t.push_back(0);\n" + " t.push_back(0);\n" "}\n" "template \n" "void fun(bool x = false) {\n" From b5b29b63800caa39000b13debb97a2a118f3bf7e Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Mon, 14 Apr 2025 08:53:00 +0200 Subject: [PATCH 3/3] Update symboldatabase.cpp --- lib/symboldatabase.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index c49f3bdeae0..3356b91abd4 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -6019,8 +6019,7 @@ const Function* Scope::findFunction(const Token *tok, bool requireConst, Referen // Only one candidate left if (matches.size() == 1 && std::none_of(functionList.begin(), functionList.end(), [tok](const Function& f) { - const auto nTok = tok->str().size(); - return startsWith(f.name(), tok->str()) && f.name().size() > nTok + 2 && f.name()[nTok + 1] == '<'; + return startsWith(f.name(), tok->str() + " <"); })) return matches[0];