@@ -1736,6 +1736,12 @@ static bool isStdMoveOrStdForwarded(Token * tok, ValueFlow::Value::MoveKind * mo
17361736 return true ;
17371737}
17381738
1739+ static bool isOpenParenthesisMemberFunctionCallOfVarId (const Token * openParenthesisToken, unsigned int varId)
1740+ {
1741+ return Token::Match (openParenthesisToken->tokAt (-3 )," %varid% . %name% (" , varId) &&
1742+ openParenthesisToken->tokAt (-2 )->originalName () == emptyString;
1743+ }
1744+
17391745static void valueFlowAfterMove (TokenList *tokenlist, SymbolDatabase* symboldatabase, ErrorLogger *errorLogger, const Settings *settings)
17401746{
17411747 if (!tokenlist->isCPP () || settings->standards .cpp < Standards::CPP11)
@@ -1757,15 +1763,18 @@ static void valueFlowAfterMove(TokenList *tokenlist, SymbolDatabase* symboldatab
17571763 ValueFlow::Value::MoveKind moveKind;
17581764 if (!isStdMoveOrStdForwarded (tok, &moveKind, &varTok))
17591765 continue ;
1766+ const unsigned int varId = varTok->varId ();
17601767 // x is not MOVED after assignment if code is: x = ... std::move(x) .. ;
17611768 const Token *parent = tok->astParent ();
1762- while (parent && parent->str () != " =" && parent->str () != " return" )
1769+ while (parent && parent->str () != " =" && parent->str () != " return" &&
1770+ !(parent->str () == " (" && isOpenParenthesisMemberFunctionCallOfVarId (parent, varId)))
17631771 parent = parent->astParent ();
1764- if (parent && parent->str () == " return" ) // MOVED in return statement
1772+ if (parent &&
1773+ (parent->str () == " return" || // MOVED in return statement
1774+ parent->str () == " (" )) // MOVED in self assignment, isOpenParenthesisMemberFunctionCallOfVarId == true
17651775 continue ;
1766- if (parent && parent->astOperand1 ()->str () == varTok-> str () )
1776+ if (parent && parent->astOperand1 ()->varId () == varId )
17671777 continue ;
1768- const unsigned int varid = varTok->varId ();
17691778 const Variable *var = varTok->variable ();
17701779 if (!var)
17711780 continue ;
@@ -1778,7 +1787,7 @@ static void valueFlowAfterMove(TokenList *tokenlist, SymbolDatabase* symboldatab
17781787 std::list<ValueFlow::Value> values;
17791788 values.push_back (value);
17801789
1781- valueFlowForward (varTok->next (), endOfVarScope, var, varid , values, false , tokenlist, errorLogger, settings);
1790+ valueFlowForward (varTok->next (), endOfVarScope, var, varId , values, false , tokenlist, errorLogger, settings);
17821791 }
17831792 }
17841793}
0 commit comments