Index: llvm/trunk/include/llvm/ADT/iterator.h =================================================================== --- llvm/trunk/include/llvm/ADT/iterator.h +++ llvm/trunk/include/llvm/ADT/iterator.h @@ -309,8 +309,10 @@ template ())> class pointer_iterator - : public iterator_adaptor_base, - WrappedIteratorT, T> { + : public iterator_adaptor_base< + pointer_iterator, WrappedIteratorT, + typename std::iterator_traits::iterator_category, + T> { mutable T Ptr; public: Index: llvm/trunk/unittests/ADT/IteratorTest.cpp =================================================================== --- llvm/trunk/unittests/ADT/IteratorTest.cpp +++ llvm/trunk/unittests/ADT/IteratorTest.cpp @@ -7,6 +7,7 @@ // //===----------------------------------------------------------------------===// +#include "llvm/ADT/ilist.h" #include "llvm/ADT/iterator.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/STLExtras.h" @@ -35,6 +36,34 @@ static_assert(std::is_same>::value, ""); +// Ensure that pointe{e,r}_iterator adaptors correctly forward the category of +// the underlying iterator. + +using RandomAccessIter = SmallVectorImpl::iterator; +using BidiIter = ilist::iterator; + +template +using pointee_iterator_defaulted = pointee_iterator; +template +using pointer_iterator_defaulted = pointer_iterator; + +// Ensures that an iterator and its adaptation have the same iterator_category. +template class A, typename It> +using IsAdaptedIterCategorySame = + std::is_same::iterator_category, + typename std::iterator_traits>::iterator_category>; + +// pointeE_iterator +static_assert(IsAdaptedIterCategorySame::value, ""); +static_assert(IsAdaptedIterCategorySame::value, ""); +// pointeR_iterator +static_assert(IsAdaptedIterCategorySame::value, ""); +static_assert(IsAdaptedIterCategorySame::value, ""); + TEST(PointeeIteratorTest, Basic) { int arr[4] = {1, 2, 3, 4}; SmallVector V;