diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index e4989ba4376..ebca5a791ab 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -2189,6 +2189,13 @@ void CheckClass::checkConst() const bool suggestStatic = memberAccessed != MemberAccess::MEMBER && !func.isOperator(); if ((returnsPtrOrRef || func.isConst() || func.hasLvalRefQualifier()) && !suggestStatic) continue; + if (suggestStatic && func.isConst()) { + const auto overloads = func.getOverloadedFunctions(); + if (overloads.size() > 1 && std::any_of(overloads.begin(), overloads.end(), [&](const Function* ovl) { + return &func != ovl && func.argCount() == ovl->argCount() && func.argsMatch(ovl->functionScope, ovl->argDef, func.argDef, emptyString, 0); + })) + continue; + } std::string classname = scope->className; const Scope *nest = scope->nestedIn; diff --git a/test/testclass.cpp b/test/testclass.cpp index 321e6918d57..8738744c369 100644 --- a/test/testclass.cpp +++ b/test/testclass.cpp @@ -190,6 +190,7 @@ class TestClass : public TestFixture { TEST_CASE(const97); TEST_CASE(const98); TEST_CASE(const99); + TEST_CASE(const100); TEST_CASE(const_handleDefaultParameters); TEST_CASE(const_passThisToMemberOfOtherClass); @@ -6855,6 +6856,15 @@ class TestClass : public TestFixture { ASSERT_EQUALS("", errout_str()); } + void const100() { + checkConst("struct S {\n" // #14023 + " void f() { ++i; }\n" + " void f() const {}\n" + " int i;\n" + "};\n"); + ASSERT_EQUALS("", errout_str()); + } + void const_handleDefaultParameters() { checkConst("struct Foo {\n" " void foo1(int i, int j = 0) {\n"