@@ -807,7 +807,11 @@ static void followVariableExpressionError(const Token *tok1, const Token *tok2,
807807 errors->push_back (item);
808808}
809809
810- std::vector<ReferenceToken> followAllReferences (const Token* tok, bool inconclusive, ErrorPath errors, int depth)
810+ std::vector<ReferenceToken> followAllReferences (const Token* tok,
811+ bool temporary,
812+ bool inconclusive,
813+ ErrorPath errors,
814+ int depth)
811815{
812816 struct ReferenceTokenLess {
813817 bool operator ()(const ReferenceToken& x, const ReferenceToken& y) const {
@@ -831,10 +835,11 @@ std::vector<ReferenceToken> followAllReferences(const Token* tok, bool inconclus
831835 } else if (Token::simpleMatch (var->declEndToken (), " =" )) {
832836 errors.emplace_back (var->declEndToken (), " Assigned to reference." );
833837 const Token *vartok = var->declEndToken ()->astOperand2 ();
834- if (vartok == tok)
838+ if (vartok == tok || (!temporary && isTemporary (true , vartok, nullptr , true ) &&
839+ (var->isConst () || var->isRValueReference ())))
835840 return {{tok, std::move (errors)}};
836841 if (vartok)
837- return followAllReferences (vartok, inconclusive, std::move (errors), depth - 1 );
842+ return followAllReferences (vartok, temporary, inconclusive, std::move (errors), depth - 1 );
838843 } else {
839844 return {{tok, std::move (errors)}};
840845 }
@@ -844,9 +849,9 @@ std::vector<ReferenceToken> followAllReferences(const Token* tok, bool inconclus
844849 const Token* tok2 = tok->astOperand2 ();
845850
846851 std::vector<ReferenceToken> refs;
847- refs = followAllReferences (tok2->astOperand1 (), inconclusive, errors, depth - 1 );
852+ refs = followAllReferences (tok2->astOperand1 (), temporary, inconclusive, errors, depth - 1 );
848853 result.insert (refs.begin (), refs.end ());
849- refs = followAllReferences (tok2->astOperand2 (), inconclusive, errors, depth - 1 );
854+ refs = followAllReferences (tok2->astOperand2 (), temporary, inconclusive, errors, depth - 1 );
850855 result.insert (refs.begin (), refs.end ());
851856
852857 if (!inconclusive && result.size () != 1 )
@@ -865,7 +870,8 @@ std::vector<ReferenceToken> followAllReferences(const Token* tok, bool inconclus
865870 for (const Token* returnTok : returns) {
866871 if (returnTok == tok)
867872 continue ;
868- for (const ReferenceToken& rt:followAllReferences (returnTok, inconclusive, errors, depth - returns.size ())) {
873+ for (const ReferenceToken& rt :
874+ followAllReferences (returnTok, temporary, inconclusive, errors, depth - returns.size ())) {
869875 const Variable* argvar = rt.token ->variable ();
870876 if (!argvar)
871877 return {{tok, std::move (errors)}};
@@ -880,7 +886,8 @@ std::vector<ReferenceToken> followAllReferences(const Token* tok, bool inconclus
880886 ErrorPath er = errors;
881887 er.emplace_back (returnTok, " Return reference." );
882888 er.emplace_back (tok->previous (), " Called function passing '" + argTok->expressionString () + " '." );
883- std::vector<ReferenceToken> refs = followAllReferences (argTok, inconclusive, std::move (er), depth - returns.size ());
889+ std::vector<ReferenceToken> refs =
890+ followAllReferences (argTok, temporary, inconclusive, std::move (er), depth - returns.size ());
884891 result.insert (refs.begin (), refs.end ());
885892 if (!inconclusive && result.size () > 1 )
886893 return {{tok, std::move (errors)}};
@@ -898,7 +905,7 @@ const Token* followReferences(const Token* tok, ErrorPath* errors)
898905{
899906 if (!tok)
900907 return nullptr ;
901- std::vector<ReferenceToken> refs = followAllReferences (tok, false );
908+ std::vector<ReferenceToken> refs = followAllReferences (tok, true , false );
902909 if (refs.size () == 1 ) {
903910 if (errors)
904911 *errors = refs.front ().errors ;
0 commit comments