@@ -3223,6 +3223,14 @@ static Token* findEndOfFunctionCallForParameter(Token* parameterToken)
32233223 return nextAfterAstRightmostLeaf (parent);
32243224}
32253225
3226+ static bool isTryEmplace (const Token* tok)
3227+ {
3228+ if (tok->str () != " (" || !Token::simpleMatch (tok->astOperand1 (), " ." ) || !tok->astOperand1 ()->astOperand1 () || !Token::simpleMatch (tok->astOperand1 ()->astOperand2 (), " try_emplace" ))
3229+ return false ;
3230+ const ValueType* vt = tok->astOperand1 ()->astOperand1 ()->valueType ();
3231+ return vt && vt->container && vt->container ->stdAssociativeLike ;
3232+ }
3233+
32263234static void valueFlowAfterMove (const TokenList& tokenlist, const SymbolDatabase& symboldatabase, ErrorLogger& errorLogger, const Settings& settings)
32273235{
32283236 if (!tokenlist.isCPP () || settings.standards .cpp < Standards::CPP11)
@@ -3265,9 +3273,15 @@ static void valueFlowAfterMove(const TokenList& tokenlist, const SymbolDatabase&
32653273 const nonneg int varId = varTok->varId ();
32663274 // x is not MOVED after assignment if code is: x = ... std::move(x) .. ;
32673275 const Token *parent = tok->astParent ();
3276+ bool bail = false ;
32683277 while (parent && parent->str () != " =" && parent->str () != " return" &&
3269- !(parent->str () == " (" && isOpenParenthesisMemberFunctionCallOfVarId (parent, varId)))
3278+ !(parent->str () == " (" && isOpenParenthesisMemberFunctionCallOfVarId (parent, varId))) {
3279+ if (isTryEmplace (parent)) {
3280+ bail = true ;
3281+ break ;
3282+ }
32703283 parent = parent->astParent ();
3284+ }
32713285 if (parent &&
32723286 (parent->str () == " return" || // MOVED in return statement
32733287 parent->str () == " (" )) // MOVED in self assignment, isOpenParenthesisMemberFunctionCallOfVarId == true
0 commit comments