Fixed #4689 (False positive: Unused private function (used in default argument of constructor))
This commit is contained in:
parent
a1b9bb0688
commit
80093f0a40
|
@ -801,6 +801,14 @@ static bool checkFunctionUsage(const std::string& name, const Scope* scope)
|
||||||
|
|
||||||
for (std::list<Function>::const_iterator func = scope->functionList.begin(); func != scope->functionList.end(); ++func) {
|
for (std::list<Function>::const_iterator func = scope->functionList.begin(); func != scope->functionList.end(); ++func) {
|
||||||
if (func->functionScope) {
|
if (func->functionScope) {
|
||||||
|
if (Token::Match(func->tokenDef, "%var% (")) {
|
||||||
|
for (const Token *ftok = func->tokenDef->tokAt(2); ftok && ftok->str() != ")"; ftok = ftok->next()) {
|
||||||
|
if (Token::Match(ftok, "= %var% (") && ftok->strAt(1) == name)
|
||||||
|
return true;
|
||||||
|
if (ftok->str() == "(")
|
||||||
|
ftok = ftok->link();
|
||||||
|
}
|
||||||
|
}
|
||||||
for (const Token *ftok = func->functionScope->classDef->linkAt(1); ftok != func->functionScope->classEnd; ftok = ftok->next()) {
|
for (const Token *ftok = func->functionScope->classDef->linkAt(1); ftok != func->functionScope->classEnd; ftok = ftok->next()) {
|
||||||
if (ftok->str() == name) // Function used. TODO: Handle overloads
|
if (ftok->str() == name) // Function used. TODO: Handle overloads
|
||||||
return true;
|
return true;
|
||||||
|
@ -856,11 +864,12 @@ void CheckClass::privateFunctions()
|
||||||
// Check that all private functions are used
|
// Check that all private functions are used
|
||||||
bool used = checkFunctionUsage(funcName, &*scope); // Usage in this class
|
bool used = checkFunctionUsage(funcName, &*scope); // Usage in this class
|
||||||
// Check in friend classes
|
// Check in friend classes
|
||||||
for (std::list<Type::FriendInfo>::const_iterator it = scope->definedType->friendList.begin(); !used && it != scope->definedType->friendList.end(); ++it)
|
for (std::list<Type::FriendInfo>::const_iterator it = scope->definedType->friendList.begin(); !used && it != scope->definedType->friendList.end(); ++it) {
|
||||||
if (it->type)
|
if (it->type)
|
||||||
used = checkFunctionUsage(funcName, it->type->classScope);
|
used = checkFunctionUsage(funcName, it->type->classScope);
|
||||||
else
|
else
|
||||||
used = true; // Assume, it is used if we do not see friend class
|
used = true; // Assume, it is used if we do not see friend class
|
||||||
|
}
|
||||||
|
|
||||||
if (!used)
|
if (!used)
|
||||||
unusedPrivateFunctionError(FuncList.front()->tokenDef, scope->className, funcName);
|
unusedPrivateFunctionError(FuncList.front()->tokenDef, scope->className, funcName);
|
||||||
|
|
|
@ -47,6 +47,7 @@ private:
|
||||||
TEST_CASE(func_pointer5); // ticket #2233
|
TEST_CASE(func_pointer5); // ticket #2233
|
||||||
|
|
||||||
TEST_CASE(ctor);
|
TEST_CASE(ctor);
|
||||||
|
TEST_CASE(ctor2);
|
||||||
|
|
||||||
TEST_CASE(classInClass);
|
TEST_CASE(classInClass);
|
||||||
TEST_CASE(sameFunctionNames);
|
TEST_CASE(sameFunctionNames);
|
||||||
|
@ -329,6 +330,18 @@ private:
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ctor2() {
|
||||||
|
check("struct State {\n"
|
||||||
|
" State(double const totalWeighting= TotalWeighting()) :\n"
|
||||||
|
" totalWeighting_(totalWeighting) {}\n"
|
||||||
|
"private:\n"
|
||||||
|
" double TotalWeighting() { return 123.0; }\n" // called from constructor
|
||||||
|
"public:\n"
|
||||||
|
" double totalWeighting_;\n"
|
||||||
|
"};");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void classInClass() {
|
void classInClass() {
|
||||||
check("class A\n"
|
check("class A\n"
|
||||||
|
|
Loading…
Reference in New Issue