@@ -1220,54 +1220,52 @@ SmallVector<ReferenceToken> followAllReferences(const Token* tok,
12201220 return refs_result;
12211221 }
12221222
1223- } else if (Token::Match (tok->previous (), " %name% (" )) {
1223+ } else if (tok-> previous () && tok-> previous ()-> function () && Token::Match (tok->previous (), " %name% (" )) {
12241224 const Function *f = tok->previous ()->function ();
1225- if (f) {
1226- if (!Function::returnsReference (f)) {
1227- refs_result.push_back ({tok, std::move (errors)});
1228- return refs_result;
1229- }
1230- std::set<ReferenceToken, ReferenceTokenLess> result;
1231- std::vector<const Token*> returns = Function::findReturns (f);
1232- for (const Token* returnTok : returns) {
1233- if (returnTok == tok)
1234- continue ;
1235- for (const ReferenceToken& rt :
1236- followAllReferences (returnTok, temporary, inconclusive, errors, depth - returns.size ())) {
1237- const Variable* argvar = rt.token ->variable ();
1238- if (!argvar) {
1225+ if (!Function::returnsReference (f)) {
1226+ refs_result.push_back ({tok, std::move (errors)});
1227+ return refs_result;
1228+ }
1229+ std::set<ReferenceToken, ReferenceTokenLess> result;
1230+ std::vector<const Token*> returns = Function::findReturns (f);
1231+ for (const Token* returnTok : returns) {
1232+ if (returnTok == tok)
1233+ continue ;
1234+ for (const ReferenceToken& rt :
1235+ followAllReferences (returnTok, temporary, inconclusive, errors, depth - returns.size ())) {
1236+ const Variable* argvar = rt.token ->variable ();
1237+ if (!argvar) {
1238+ refs_result.push_back ({tok, std::move (errors)});
1239+ return refs_result;
1240+ }
1241+ if (argvar->isArgument () && (argvar->isReference () || argvar->isRValueReference ())) {
1242+ const int n = getArgumentPos (argvar, f);
1243+ if (n < 0 ) {
12391244 refs_result.push_back ({tok, std::move (errors)});
12401245 return refs_result;
12411246 }
1242- if (argvar->isArgument () && (argvar->isReference () || argvar->isRValueReference ())) {
1243- const int n = getArgumentPos (argvar, f);
1244- if (n < 0 ) {
1245- refs_result.push_back ({tok, std::move (errors)});
1246- return refs_result;
1247- }
1248- std::vector<const Token*> args = getArguments (tok->previous ());
1249- if (n >= args.size ()) {
1250- refs_result.push_back ({tok, std::move (errors)});
1251- return refs_result;
1252- }
1253- const Token* argTok = args[n];
1254- ErrorPath er = errors;
1255- er.emplace_back (returnTok, " Return reference." );
1256- er.emplace_back (tok->previous (), " Called function passing '" + argTok->expressionString () + " '." );
1257- auto refs =
1258- followAllReferences (argTok, temporary, inconclusive, std::move (er), depth - returns.size ());
1259- result.insert (refs.cbegin (), refs.cend ());
1260- if (!inconclusive && result.size () > 1 ) {
1261- refs_result.push_back ({tok, std::move (errors)});
1262- return refs_result;
1263- }
1247+ std::vector<const Token*> args = getArguments (tok->previous ());
1248+ if (n >= args.size ()) {
1249+ refs_result.push_back ({tok, std::move (errors)});
1250+ return refs_result;
1251+ }
1252+ const Token* argTok = args[n];
1253+ ErrorPath er = errors;
1254+ er.emplace_back (returnTok, " Return reference." );
1255+ er.emplace_back (tok->previous (), " Called function passing '" + argTok->expressionString () + " '." );
1256+ auto refs =
1257+ followAllReferences (argTok, temporary, inconclusive, std::move (er), depth - returns.size ());
1258+ result.insert (refs.cbegin (), refs.cend ());
1259+ if (!inconclusive && result.size () > 1 ) {
1260+ refs_result.push_back ({tok, std::move (errors)});
1261+ return refs_result;
12641262 }
12651263 }
12661264 }
1267- if (!result. empty ()) {
1268- refs_result. insert (refs_result. end (), result.cbegin (), result. cend ());
1269- return refs_result ;
1270- }
1265+ }
1266+ if (! result.empty ()) {
1267+ refs_result. insert (refs_result. end (), result. cbegin (), result. cend ()) ;
1268+ return refs_result;
12711269 }
12721270 }
12731271 refs_result.push_back ({tok, std::move (errors)});
@@ -1583,8 +1581,8 @@ bool isSameExpression(bool cpp, bool macro, const Token *tok1, const Token *tok2
15831581 }
15841582 }
15851583 // templates/casts
1586- if ((Token::Match ( tok1, " %name% < " ) && tok1->next ()->link ()) ||
1587- (Token::Match ( tok2, " %name% < " ) && tok2->next ()->link ())) {
1584+ if ((tok1-> next ( ) && tok1->next ()->link () && Token::Match (tok1, " %name% < " )) ||
1585+ (tok2-> next ( ) && tok2->next ()->link () && Token::Match (tok2, " %name% < " ))) {
15881586
15891587 // non-const template function that is not a dynamic_cast => return false
15901588 if (pure && Token::simpleMatch (tok1->next ()->link (), " > (" ) &&
0 commit comments