summaryrefslogtreecommitdiffstats
path: root/clang/lib/Analysis/Consumed.cpp
diff options
context:
space:
mode:
authorDeLesley Hutchins <delesley@google.com>2013-10-18 18:36:21 +0000
committerDeLesley Hutchins <delesley@google.com>2013-10-18 18:36:21 +0000
commit11a66c1240595eef13aafe26ea07a5354d541f82 (patch)
treead285c2c9ca6e4691359775670b95fea90698869 /clang/lib/Analysis/Consumed.cpp
parent8bb5d602356521e1b76a76d618456dfab150724b (diff)
downloadbcm5719-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.cpp60
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)));
}
}
OpenPOWER on IntegriCloud