From 11a66c1240595eef13aafe26ea07a5354d541f82 Mon Sep 17 00:00:00 2001 From: DeLesley Hutchins Date: Fri, 18 Oct 2013 18:36:21 +0000 Subject: Consumed analysis: All the return_typestate parameter to be attached to the default constructor. Patch by chris.wailes@gmail.com, reviewed by delesley. llvm-svn: 192991 --- clang/lib/Analysis/Consumed.cpp | 60 +++++++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 26 deletions(-) (limited to 'clang/lib/Analysis/Consumed.cpp') diff --git a/clang/lib/Analysis/Consumed.cpp b/clang/lib/Analysis/Consumed.cpp index a7d747f705b..ef9617a3ec4 100644 --- a/clang/lib/Analysis/Consumed.cpp +++ b/clang/lib/Analysis/Consumed.cpp @@ -660,38 +660,46 @@ void ConsumedStmtVisitor::VisitCXXConstructExpr(const CXXConstructExpr *Call) { ASTContext &CurrContext = AC.getASTContext(); QualType ThisType = Constructor->getThisType(CurrContext)->getPointeeType(); - if (isConsumableType(ThisType)) { - if (Constructor->isDefaultConstructor()) { + if (!isConsumableType(ThisType)) + return; + + // FIXME: What should happen if someone annotates the move constructor? + if (Constructor->hasAttr()) { + ReturnTypestateAttr *RTAttr = Constructor->getAttr(); + ConsumedState RetState = mapReturnTypestateAttrState(RTAttr); + PropagationMap.insert(PairType(Call, PropagationInfo(RetState, ThisType))); + + } else if (Constructor->isDefaultConstructor()) { + + PropagationMap.insert(PairType(Call, + PropagationInfo(consumed::CS_Consumed, ThisType))); + + } else if (Constructor->isMoveConstructor()) { + + PropagationInfo PInfo = + PropagationMap.find(Call->getArg(0))->second; + + if (PInfo.isVar()) { + const VarDecl* Var = PInfo.getVar(); PropagationMap.insert(PairType(Call, - PropagationInfo(consumed::CS_Consumed, ThisType))); + PropagationInfo(StateMap->getState(Var), ThisType))); - } else if (Constructor->isMoveConstructor()) { - - PropagationInfo PInfo = - PropagationMap.find(Call->getArg(0))->second; - - 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)); + StateMap->setState(Var, consumed::CS_Consumed); } else { - propagateReturnType(Call, Constructor, ThisType); + 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)); + + } else { + ConsumedState RetState = mapConsumableAttrState(ThisType); + PropagationMap.insert(PairType(Call, PropagationInfo(RetState, ThisType))); } } -- cgit v1.2.3