diff options
Diffstat (limited to 'include/clang/Analysis/Analyses/Consumed.h')
-rw-r--r-- | include/clang/Analysis/Analyses/Consumed.h | 38 |
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); |