Fix #11827 FP duplInheritedMember - different return type (#5231)

This commit is contained in:
chrchr-github 2023-07-12 15:56:07 +02:00 committed by GitHub
parent 3508464c6d
commit c0bd9f8bbd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 29 additions and 6 deletions

View File

@ -2468,8 +2468,9 @@ bool CheckClass::checkConstFunc(const Scope *scope, const Function *func, Member
auto hasOverloadedMemberAccess = [](const Token* end, const Scope* scope) -> bool {
if (!end || !scope || !Token::simpleMatch(end->astParent(), "."))
return false;
auto it = std::find_if(scope->functionList.begin(), scope->functionList.end(), [](const Function& f) {
return f.isConst() && f.name() == "operator.";
const std::string op = "operator" + end->astParent()->originalName();
auto it = std::find_if(scope->functionList.begin(), scope->functionList.end(), [&op](const Function& f) {
return f.isConst() && f.name() == op;
});
if (it == scope->functionList.end() || !it->retType || !it->retType->classScope)
return false;

View File

@ -4396,8 +4396,7 @@ const Function * Function::getOverriddenFunctionRecursive(const ::Type* baseType
// check for matching return parameters
while (!Token::Match(temp1, "virtual|public:|private:|protected:|{|}|;")) {
if (temp1->str() != temp2->str() &&
!(temp1->str() == derivedFromType->name() &&
temp2->str() == baseType->name())) {
!(temp1->type() && temp2->type() && temp2->type()->isDerivedFrom(temp1->type()->name()))) {
match = false;
break;
}

View File

@ -9778,7 +9778,7 @@ void Tokenizer::simplifyOperatorName()
if (par->str() == "," && !op.empty())
break;
if (!(Token::Match(par, "<|>") && !op.empty())) {
op += par->str();
op += par->str() == "." ? par->originalName() : par->str();
par = par->next();
done = false;
}

View File

@ -692,6 +692,17 @@ private:
" T() : S::T() {}\n"
"};\n");
ASSERT_EQUALS("", errout.str());
checkDuplInheritedMembers("struct S {};\n" // #11827
"struct SPtr {\n"
" virtual S* operator->() const { return p; }\n"
" S* p = nullptr;\n"
"};\n"
"struct T : public S {};\n"
"struct TPtr : public SPtr {\n"
" T* operator->() const { return (T*)p; }\n"
"};\n");
ASSERT_EQUALS("", errout.str());
}
#define checkCopyConstructor(code) checkCopyConstructor_(code, __FILE__, __LINE__)
@ -8349,6 +8360,18 @@ private:
" friend T f();\n"
"};\n");
ASSERT_EQUALS("", errout.str());
checkOverride("struct S {};\n" // #11827
"struct SPtr {\n"
" virtual S* operator->() const { return p; }\n"
" S* p = nullptr;\n"
"};\n"
"struct T : public S {};\n"
"struct TPtr : public SPtr {\n"
" T* operator->() const { return (T*)p; }\n"
"};\n");
ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:8]: (style) The function 'operator->' overrides a function in a base class but is not marked with a 'override' specifier.\n",
errout.str());
}
void overrideCVRefQualifiers() {

View File

@ -4950,7 +4950,7 @@ private:
const char code[] = "void f() {"
"static_cast<ScToken*>(xResult.operator->())->GetMatrix();"
"}";
const char result[] = "void f ( ) { static_cast < ScToken * > ( xResult . operator. ( ) ) . GetMatrix ( ) ; }";
const char result[] = "void f ( ) { static_cast < ScToken * > ( xResult . operator-> ( ) ) . GetMatrix ( ) ; }";
ASSERT_EQUALS(result, tokenizeAndStringify(code));
}