summaryrefslogtreecommitdiffstats
path: root/include/clang/Analysis/Analyses/Consumed.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/clang/Analysis/Analyses/Consumed.h')
-rw-r--r--include/clang/Analysis/Analyses/Consumed.h38
1 files changed, 21 insertions, 17 deletions
diff --git a/include/clang/Analysis/Analyses/Consumed.h b/include/clang/Analysis/Analyses/Consumed.h
index a710923..1f5aa12 100644
--- a/include/clang/Analysis/Analyses/Consumed.h
+++ b/include/clang/Analysis/Analyses/Consumed.h
@@ -71,7 +71,7 @@ namespace consumed {
virtual void warnParamReturnTypestateMismatch(SourceLocation Loc,
StringRef VariableName,
StringRef ExpectedState,
- StringRef ObservedState) {};
+ StringRef ObservedState) {}
// FIXME: Add documentation.
virtual void warnParamTypestateMismatch(SourceLocation LOC,
@@ -162,8 +162,8 @@ namespace consumed {
ConsumedState getState(const CXXBindTemporaryExpr *Tmp) const;
/// \brief Merge this state map with another map.
- void intersect(const ConsumedStateMap *Other);
-
+ void intersect(const ConsumedStateMap &Other);
+
void intersectAtLoopHead(const CFGBlock *LoopHead, const CFGBlock *LoopBack,
const ConsumedStateMap *LoopBackStates,
ConsumedWarningsHandlerBase &WarningsHandler);
@@ -196,15 +196,19 @@ namespace consumed {
};
class ConsumedBlockInfo {
- std::vector<ConsumedStateMap*> StateMapsArray;
+ std::vector<std::unique_ptr<ConsumedStateMap>> StateMapsArray;
std::vector<unsigned int> VisitOrder;
public:
- ConsumedBlockInfo() { }
- ~ConsumedBlockInfo() { llvm::DeleteContainerPointers(StateMapsArray); }
+ ConsumedBlockInfo() = default;
+ ConsumedBlockInfo &operator=(ConsumedBlockInfo &&Other) {
+ StateMapsArray = std::move(Other.StateMapsArray);
+ VisitOrder = std::move(Other.VisitOrder);
+ return *this;
+ }
ConsumedBlockInfo(unsigned int NumBlocks, PostOrderCFGView *SortedGraph)
- : StateMapsArray(NumBlocks, nullptr), VisitOrder(NumBlocks, 0) {
+ : StateMapsArray(NumBlocks), VisitOrder(NumBlocks, 0) {
unsigned int VisitOrderCounter = 0;
for (PostOrderCFGView::iterator BI = SortedGraph->begin(),
BE = SortedGraph->end(); BI != BE; ++BI) {
@@ -214,17 +218,18 @@ namespace consumed {
bool allBackEdgesVisited(const CFGBlock *CurrBlock,
const CFGBlock *TargetBlock);
-
+
void addInfo(const CFGBlock *Block, ConsumedStateMap *StateMap,
- bool &AlreadyOwned);
- void addInfo(const CFGBlock *Block, ConsumedStateMap *StateMap);
-
+ std::unique_ptr<ConsumedStateMap> &OwnedStateMap);
+ void addInfo(const CFGBlock *Block,
+ std::unique_ptr<ConsumedStateMap> StateMap);
+
ConsumedStateMap* borrowInfo(const CFGBlock *Block);
void discardInfo(const CFGBlock *Block);
-
- ConsumedStateMap* getInfo(const CFGBlock *Block);
-
+
+ std::unique_ptr<ConsumedStateMap> getInfo(const CFGBlock *Block);
+
bool isBackEdge(const CFGBlock *From, const CFGBlock *To);
bool isBackEdgeTarget(const CFGBlock *Block);
};
@@ -233,13 +238,12 @@ namespace consumed {
class ConsumedAnalyzer {
ConsumedBlockInfo BlockInfo;
- ConsumedStateMap *CurrStates;
-
+ std::unique_ptr<ConsumedStateMap> CurrStates;
+
ConsumedState ExpectedReturnState;
void determineExpectedReturnState(AnalysisDeclContext &AC,
const FunctionDecl *D);
- bool hasConsumableAttributes(const CXXRecordDecl *RD);
bool splitState(const CFGBlock *CurrBlock,
const ConsumedStmtVisitor &Visitor);
OpenPOWER on IntegriCloud