diff options
-rw-r--r-- | llvm/include/llvm/ADT/iterator.h | 27 | ||||
-rw-r--r-- | llvm/include/llvm/Analysis/LazyCallGraph.h | 5 | ||||
-rw-r--r-- | llvm/include/llvm/IR/User.h | 5 |
3 files changed, 23 insertions, 14 deletions
diff --git a/llvm/include/llvm/ADT/iterator.h b/llvm/include/llvm/ADT/iterator.h index af9b85c56c9..8d6a8eb163f 100644 --- a/llvm/include/llvm/ADT/iterator.h +++ b/llvm/include/llvm/ADT/iterator.h @@ -97,14 +97,19 @@ struct iterator_facade_base /// This class can be used through CRTP to adapt one iterator into another. /// Typically this is done through providing in the derived class a custom \c /// operator* implementation. Other methods can be overridden as well. -template <typename DerivedT, typename WrappedIteratorT, typename T, - typename PointerT = T *, typename ReferenceT = T &, - // Don't provide these, they are mostly to act as aliases below. - typename WrappedTraitsT = std::iterator_traits<WrappedIteratorT>> +template < + typename DerivedT, typename WrappedIteratorT, + typename IteratorCategoryT = + typename std::iterator_traits<WrappedIteratorT>::iterator_category, + typename T = typename std::iterator_traits<WrappedIteratorT>::value_type, + typename DifferenceTypeT = + typename std::iterator_traits<WrappedIteratorT>::difference_type, + typename PointerT = T *, typename ReferenceT = T &, + // Don't provide these, they are mostly to act as aliases below. + typename WrappedTraitsT = std::iterator_traits<WrappedIteratorT>> class iterator_adaptor_base - : public iterator_facade_base< - DerivedT, typename WrappedTraitsT::iterator_category, T, - typename WrappedTraitsT::difference_type, PointerT, ReferenceT> { + : public iterator_facade_base<DerivedT, IteratorCategoryT, T, + DifferenceTypeT, PointerT, ReferenceT> { typedef typename iterator_adaptor_base::iterator_facade_base BaseT; protected: @@ -123,7 +128,7 @@ protected: : I(std::forward<U &&>(u)) {} public: - typedef typename WrappedTraitsT::difference_type difference_type; + typedef DifferenceTypeT difference_type; DerivedT &operator+=(difference_type n) { I += n; @@ -168,8 +173,10 @@ template <typename WrappedIteratorT, typename T = typename std::remove_reference< decltype(**std::declval<WrappedIteratorT>())>::type> struct pointee_iterator - : iterator_adaptor_base<pointee_iterator<WrappedIteratorT>, - WrappedIteratorT, T> { + : iterator_adaptor_base< + pointee_iterator<WrappedIteratorT>, WrappedIteratorT, + typename std::iterator_traits<WrappedIteratorT>::iterator_category, + T> { pointee_iterator() {} template <typename U> pointee_iterator(U &&u) diff --git a/llvm/include/llvm/Analysis/LazyCallGraph.h b/llvm/include/llvm/Analysis/LazyCallGraph.h index e4069819524..7f9a43aba36 100644 --- a/llvm/include/llvm/Analysis/LazyCallGraph.h +++ b/llvm/include/llvm/Analysis/LazyCallGraph.h @@ -113,8 +113,9 @@ public: /// be scanned for "calls" or uses of functions and its child information /// will be constructed. All of these results are accumulated and cached in /// the graph. - class iterator : public iterator_adaptor_base< - iterator, NodeVectorImplT::iterator, Node> { + class iterator + : public iterator_adaptor_base<iterator, NodeVectorImplT::iterator, + std::random_access_iterator_tag, Node> { friend class LazyCallGraph; friend class LazyCallGraph::Node; diff --git a/llvm/include/llvm/IR/User.h b/llvm/include/llvm/IR/User.h index 453b6ad1699..bc7696bdaf5 100644 --- a/llvm/include/llvm/IR/User.h +++ b/llvm/include/llvm/IR/User.h @@ -131,8 +131,9 @@ public: /// Convenience iterator for directly iterating over the Values in the /// OperandList struct value_op_iterator - : iterator_adaptor_base<value_op_iterator, op_iterator, Value *, Value *, - Value *> { + : iterator_adaptor_base<value_op_iterator, op_iterator, + std::random_access_iterator_tag, Value *, + ptrdiff_t, Value *, Value *> { explicit value_op_iterator(Use *U = nullptr) : iterator_adaptor_base(U) {} Value *operator*() const { return *I; } |