diff --git a/bolt/include/bolt/Core/BinaryContext.h b/bolt/include/bolt/Core/BinaryContext.h --- a/bolt/include/bolt/Core/BinaryContext.h +++ b/bolt/include/bolt/Core/BinaryContext.h @@ -104,9 +104,8 @@ /// Filter iterator. template > -class FilterIterator - : public std::iterator::value_type> { +class FilterIterator { + using inner_traits = std::iterator_traits; using Iterator = FilterIterator; using T = typename std::iterator_traits::reference; using PointerT = typename std::iterator_traits::pointer; @@ -128,6 +127,12 @@ } public: + using iterator_category = std::bidirectional_iterator_tag; + using value_type = typename inner_traits::value_type; + using difference_type = typename inner_traits::difference_type; + using pointer = typename inner_traits::pointer; + using reference = typename inner_traits::reference; + Iterator &operator++() { next(); return *this; } Iterator &operator--() { prev(); return *this; } Iterator operator++(int) { auto Tmp(Itr); next(); return Tmp; } diff --git a/bolt/include/bolt/Core/MCPlusBuilder.h b/bolt/include/bolt/Core/MCPlusBuilder.h --- a/bolt/include/bolt/Core/MCPlusBuilder.h +++ b/bolt/include/bolt/Core/MCPlusBuilder.h @@ -164,9 +164,14 @@ void setTailCall(MCInst &Inst); public: - class InstructionIterator - : public std::iterator { + class InstructionIterator { public: + using iterator_category = std::bidirectional_iterator_tag; + using value_type = MCInst; + using difference_type = std::ptrdiff_t; + using pointer = value_type *; + using reference = value_type &; + class Impl { public: virtual Impl *Copy() const = 0; diff --git a/bolt/include/bolt/Passes/DataflowAnalysis.h b/bolt/include/bolt/Passes/DataflowAnalysis.h --- a/bolt/include/bolt/Passes/DataflowAnalysis.h +++ b/bolt/include/bolt/Passes/DataflowAnalysis.h @@ -439,13 +439,18 @@ /// Define an iterator for navigating the expressions calculated by a /// dataflow analysis at each program point, when they are backed by a /// BitVector. -class ExprIterator - : public std::iterator { +class ExprIterator { const BitVector *BV; const std::vector &Expressions; int Idx; public: + using iterator_category = std::forward_iterator_tag; + using value_type = const MCInst *; + using difference_type = std::ptrdiff_t; + using pointer = value_type *; + using reference = value_type &; + ExprIterator &operator++() { assert(Idx != -1 && "Iterator already at the end"); Idx = BV->find_next(Idx);