Index: lib/Analysis/Consumed.cpp =================================================================== --- lib/Analysis/Consumed.cpp +++ lib/Analysis/Consumed.cpp @@ -592,12 +592,7 @@ // Special case for the std::move function. // TODO: Make this more specific. (Deferred) if (FunDecl->getNameAsString() == "move") { - InfoEntry Entry = PropagationMap.find(Call->getArg(0)); - - if (Entry != PropagationMap.end()) { - PropagationMap.insert(PairType(Call, Entry->second)); - } - + forwardInfo(Call->getArg(0), Call); return; } @@ -690,26 +685,25 @@ } else if (Constructor->isMoveConstructor()) { - PropagationInfo PInfo = - PropagationMap.find(Call->getArg(0))->second; + InfoEntry Entry = PropagationMap.find(Call->getArg(0)); - if (PInfo.isVar()) { - const VarDecl* Var = PInfo.getVar(); - - PropagationMap.insert(PairType(Call, - PropagationInfo(StateMap->getState(Var), ThisType))); - - StateMap->setState(Var, consumed::CS_Consumed); + if (Entry != PropagationMap.end()) { + PropagationInfo PInfo = Entry->second; - } else { - PropagationMap.insert(PairType(Call, PInfo)); + if (PInfo.isVar()) { + const VarDecl* Var = PInfo.getVar(); + + PropagationMap.insert(PairType(Call, + PropagationInfo(StateMap->getState(Var), ThisType))); + + StateMap->setState(Var, consumed::CS_Consumed); + + } else { + PropagationMap.insert(PairType(Call, PInfo)); + } } - } else if (Constructor->isCopyConstructor()) { - MapType::iterator Entry = PropagationMap.find(Call->getArg(0)); - - if (Entry != PropagationMap.end()) - PropagationMap.insert(PairType(Call, Entry->second)); + forwardInfo(Call->getArg(0), Call); } else { ConsumedState RetState = mapConsumableAttrState(ThisType); @@ -717,7 +711,6 @@ } } - void ConsumedStmtVisitor::VisitCXXMemberCallExpr( const CXXMemberCallExpr *Call) { @@ -854,10 +847,7 @@ void ConsumedStmtVisitor::VisitMaterializeTemporaryExpr( const MaterializeTemporaryExpr *Temp) { - InfoEntry Entry = PropagationMap.find(Temp->GetTemporaryExpr()); - - if (Entry != PropagationMap.end()) - PropagationMap.insert(PairType(Temp, Entry->second)); + forwardInfo(Temp->GetTemporaryExpr(), Temp); } void ConsumedStmtVisitor::VisitMemberExpr(const MemberExpr *MExpr) {