From 32d90d67549dac8d8106d599d61d613792c0f229 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Tue, 16 Apr 2024 22:09:19 +0200 Subject: [PATCH] Fix #12619 FP unusedPrivateFunction with trailing return type and override --- lib/symboldatabase.cpp | 5 ++++- test/testunusedprivfunc.cpp | 13 +++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 4f86497551c..04ea1a4de1c 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -1959,7 +1959,9 @@ bool SymbolDatabase::isFunction(const Token *tok, const Scope* outerScope, const } // skip over trailing return type + bool hasTrailingRet = false; if (tok2 && tok2->str() == ".") { + hasTrailingRet = true; for (tok2 = tok2->next(); tok2; tok2 = tok2->next()) { if (Token::Match(tok2, ";|{|=|override|final")) break; @@ -2030,7 +2032,8 @@ bool SymbolDatabase::isFunction(const Token *tok, const Scope* outerScope, const (tok2->isUpperCaseName() && Token::Match(tok2, "%name% (") && tok2->next()->link()->strAt(1) == "{") || Token::Match(tok2, ": ::| %name% (|::|<|{") || Token::Match(tok2, "&|&&| ;|{") || - Token::Match(tok2, "= delete|default ;"))) { + Token::Match(tok2, "= delete|default ;") || + (hasTrailingRet && Token::Match(tok2, "final|override")))) { *funcStart = tok; *argStart = tok->next(); *declEnd = Token::findmatch(tok2, "{|;"); diff --git a/test/testunusedprivfunc.cpp b/test/testunusedprivfunc.cpp index e214c216852..16004145732 100644 --- a/test/testunusedprivfunc.cpp +++ b/test/testunusedprivfunc.cpp @@ -83,6 +83,7 @@ class TestUnusedPrivateFunction : public TestFixture { TEST_CASE(templateSimplification); //ticket #6183 TEST_CASE(maybeUnused); + TEST_CASE(trailingReturn); } #define check(...) check_(__FILE__, __LINE__, __VA_ARGS__) @@ -863,6 +864,18 @@ class TestUnusedPrivateFunction : public TestFixture { "};"); ASSERT_EQUALS("", errout_str()); } + + void trailingReturn() { + check("struct B { virtual void f(); };\n" + "struct D : B {\n" + " auto f() -> void override;\n" + "private:\n" + " auto g() -> void;\n" + "};\n" + "auto D::f() -> void { g(); }\n" + "auto D::g() -> void {}\n"); + ASSERT_EQUALS("", errout_str()); + } }; REGISTER_TEST(TestUnusedPrivateFunction)