@@ -55,6 +55,13 @@ CheckUnusedFunctions CheckUnusedFunctions::instance;
5555
5656static const struct CWE CWE561 (561U ); // Dead Code
5757
58+ static std::string stripTemplateParameters (const std::string& funcName) {
59+ std::string name = funcName;
60+ const auto pos = name.find (' <' );
61+ if (pos > 0 && pos != std::string::npos)
62+ name.erase (pos - 1 );
63+ return name;
64+ }
5865
5966// ---------------------------------------------------------------------------
6067// FUNCTION USAGE - Check for unused functions etc
@@ -78,13 +85,9 @@ void CheckUnusedFunctions::parseTokens(const Tokenizer &tokenizer, const char Fi
7885 if (func->isExtern ())
7986 continue ;
8087
81- // Don't care about templates
82- if (tokenizer.isCPP () && func->templateDef != nullptr )
83- continue ;
84-
8588 mFunctionDecl .emplace_back (func);
8689
87- FunctionUsage &usage = mFunctions [func->name ()];
90+ FunctionUsage &usage = mFunctions [stripTemplateParameters ( func->name () )];
8891
8992 if (!usage.lineNumber )
9093 usage.lineNumber = func->token ->linenr ();
@@ -223,11 +226,11 @@ void CheckUnusedFunctions::parseTokens(const Tokenizer &tokenizer, const char Fi
223226 while (Token::Match (funcname, " %name% :: %name%" ))
224227 funcname = funcname->tokAt (2 );
225228
226- if (!Token::Match (funcname, " %name% [(),;]:}>]" ))
229+ if (!Token::Match (funcname, " %name% [(),;]:}>]" ) || funcname-> varId () )
227230 continue ;
228231 }
229232
230- if (!funcname)
233+ if (!funcname || funcname-> isKeyword () || funcname-> isStandardType () )
231234 continue ;
232235
233236 // funcname ( => Assert that the end parentheses isn't followed by {
@@ -240,15 +243,16 @@ void CheckUnusedFunctions::parseTokens(const Tokenizer &tokenizer, const char Fi
240243 }
241244
242245 if (funcname) {
243- FunctionUsage &func = mFunctions [funcname->str ()];
246+ const auto baseName = stripTemplateParameters (funcname->str ());
247+ FunctionUsage &func = mFunctions [baseName];
244248 const std::string& called_from_file = tokenizer.list .getSourceFilePath ();
245249
246250 if (func.filename .empty () || func.filename == " +" || func.filename != called_from_file)
247251 func.usedOtherFile = true ;
248252 else
249253 func.usedSameFile = true ;
250254
251- mFunctionCalls .insert (funcname-> str () );
255+ mFunctionCalls .insert (baseName );
252256 }
253257 }
254258}
0 commit comments