Skip to content

Commit e9feeef

Browse files
Fix FPs: uselessOverride (#5208)
1 parent a40e581 commit e9feeef

2 files changed

Lines changed: 31 additions & 2 deletions

File tree

lib/checkclass.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3082,15 +3082,18 @@ void CheckClass::checkUselessOverride()
30823082
for (const Function& func : classScope->functionList) {
30833083
if (!func.functionScope)
30843084
continue;
3085+
if (func.hasFinalSpecifier())
3086+
continue;
30853087
const Function* baseFunc = func.getOverriddenFunction();
3086-
if (!baseFunc || baseFunc->isPure())
3088+
if (!baseFunc || baseFunc->isPure() || baseFunc->access != func.access)
30873089
continue;
30883090
if (const Token* const call = getSingleFunctionCall(func.functionScope)) {
30893091
if (call->function() != baseFunc)
30903092
continue;
30913093
std::vector<const Token*> funcArgs = getArguments(func.tokenDef);
30923094
std::vector<const Token*> callArgs = getArguments(call);
3093-
if (!std::equal(funcArgs.begin(), funcArgs.end(), callArgs.begin(), [](const Token* t1, const Token* t2) {
3095+
if (funcArgs.size() != callArgs.size() ||
3096+
!std::equal(funcArgs.begin(), funcArgs.end(), callArgs.begin(), [](const Token* t1, const Token* t2) {
30943097
return t1->str() == t2->str();
30953098
}))
30963099
continue;

test/testclass.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8403,6 +8403,32 @@ class TestClass : public TestFixture {
84038403
" int f() override { return B::f(); }\n"
84048404
"};");
84058405
ASSERT_EQUALS("", errout.str());
8406+
8407+
checkUselessOverride("struct S { virtual void f(); };\n"
8408+
"struct D : S {\n"
8409+
" void f() final { S::f(); }\n"
8410+
"};");
8411+
ASSERT_EQUALS("", errout.str());
8412+
8413+
checkUselessOverride("struct S {\n"
8414+
"protected:\n"
8415+
" virtual void f();\n"
8416+
"};\n"
8417+
"struct D : S {\n"
8418+
"public:\n"
8419+
" void f() override { S::f(); }\n"
8420+
"};");
8421+
ASSERT_EQUALS("", errout.str());
8422+
8423+
checkUselessOverride("struct B { virtual void f(int, int, int) const; };\n" // #11799
8424+
"struct D : B {\n"
8425+
" int m = 42;\n"
8426+
" void f(int a, int b, int c) const override;\n"
8427+
"};\n"
8428+
"void D::f(int a, int b, int c) const {\n"
8429+
" B::f(a, b, m);\n"
8430+
"};");
8431+
ASSERT_EQUALS("", errout.str());
84068432
}
84078433

84088434
#define checkUnsafeClassRefMember(code) checkUnsafeClassRefMember_(code, __FILE__, __LINE__)

0 commit comments

Comments
 (0)