diff --git a/include/llvm/CFG.h b/include/llvm/CFG.h index 5228746f342..43ca8fb0a8a 100644 --- a/include/llvm/CFG.h +++ b/include/llvm/CFG.h @@ -358,7 +358,8 @@ class POIterator : public std::forward_iterator { void traverseChild() { while (VisitStack.top().second != succ_end(VisitStack.top().first)) { - BBType *BB = *VisitStack.top().second++; + BBType *BB = *VisitStack.top().second; + ++ VisitStack.top().second; if (!Visited.count(BB)) { // If the block is not visited... Visited.insert(BB); VisitStack.push(make_pair(BB, succ_begin(BB))); @@ -373,8 +374,16 @@ public: VisitStack.push(make_pair(BB, succ_begin(BB))); traverseChild(); } + inline POIterator(const _Self& x) + : Visited(x.Visited), VisitStack(x.VisitStack) { + } + inline POIterator& operator=(const _Self& x) { + Visited = x.Visited; + VisitStack = x.VisitStack; + return *this; + } inline POIterator() { /* End is when stack is empty */ } - + inline bool operator==(const _Self& x) const { return VisitStack == x.VisitStack; } @@ -400,6 +409,10 @@ public: inline _Self operator++(int) { // Postincrement _Self tmp = *this; ++*this; return tmp; } + + // Provide default begin and end methods when nothing special is needed. + static inline _Self begin (BBType *BB) { return _Self(BB); } + static inline _Self end (BBType *BB) { return _Self(); } }; inline po_iterator po_begin( Method *M) {