diff options
author | DeLesley Hutchins <delesley@google.com> | 2013-10-18 18:36:21 +0000 |
---|---|---|
committer | DeLesley Hutchins <delesley@google.com> | 2013-10-18 18:36:21 +0000 |
commit | 11a66c1240595eef13aafe26ea07a5354d541f82 (patch) | |
tree | ad285c2c9ca6e4691359775670b95fea90698869 /clang/lib/Analysis/Consumed.cpp | |
parent | 8bb5d602356521e1b76a76d618456dfab150724b (diff) | |
download | bcm5719-llvm-11a66c1240595eef13aafe26ea07a5354d541f82.tar.gz bcm5719-llvm-11a66c1240595eef13aafe26ea07a5354d541f82.zip |
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
Diffstat (limited to 'clang/lib/Analysis/Consumed.cpp')
-rw-r--r-- | clang/lib/Analysis/Consumed.cpp | 60 |
1 files changed, 34 insertions, 26 deletions
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>()) { + ReturnTypestateAttr *RTAttr = Constructor->getAttr<ReturnTypestateAttr>(); + 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))); } } |