diff options
-rw-r--r-- | llvm/include/llvm/ADT/iterator.h | 6 | ||||
-rw-r--r-- | llvm/unittests/ADT/IteratorTest.cpp | 29 |
2 files changed, 33 insertions, 2 deletions
diff --git a/llvm/include/llvm/ADT/iterator.h b/llvm/include/llvm/ADT/iterator.h index 7f7ed69a005..40e490cf786 100644 --- a/llvm/include/llvm/ADT/iterator.h +++ b/llvm/include/llvm/ADT/iterator.h @@ -309,8 +309,10 @@ make_pointee_range(RangeT &&Range) { template <typename WrappedIteratorT, typename T = decltype(&*std::declval<WrappedIteratorT>())> class pointer_iterator - : public iterator_adaptor_base<pointer_iterator<WrappedIteratorT, T>, - WrappedIteratorT, T> { + : public iterator_adaptor_base< + pointer_iterator<WrappedIteratorT, T>, WrappedIteratorT, + typename std::iterator_traits<WrappedIteratorT>::iterator_category, + T> { mutable T Ptr; public: diff --git a/llvm/unittests/ADT/IteratorTest.cpp b/llvm/unittests/ADT/IteratorTest.cpp index 50c3b01bbc7..de0a6710789 100644 --- a/llvm/unittests/ADT/IteratorTest.cpp +++ b/llvm/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<typename AdaptedIter::pointer, Shadow<2>>::value, static_assert(std::is_same<typename AdaptedIter::reference, Shadow<3>>::value, ""); +// Ensure that pointe{e,r}_iterator adaptors correctly forward the category of +// the underlying iterator. + +using RandomAccessIter = SmallVectorImpl<int*>::iterator; +using BidiIter = ilist<int*>::iterator; + +template<class T> +using pointee_iterator_defaulted = pointee_iterator<T>; +template<class T> +using pointer_iterator_defaulted = pointer_iterator<T>; + +// Ensures that an iterator and its adaptation have the same iterator_category. +template<template<typename> class A, typename It> +using IsAdaptedIterCategorySame = + std::is_same<typename std::iterator_traits<It>::iterator_category, + typename std::iterator_traits<A<It>>::iterator_category>; + +// pointeE_iterator +static_assert(IsAdaptedIterCategorySame<pointee_iterator_defaulted, + RandomAccessIter>::value, ""); +static_assert(IsAdaptedIterCategorySame<pointee_iterator_defaulted, + BidiIter>::value, ""); +// pointeR_iterator +static_assert(IsAdaptedIterCategorySame<pointer_iterator_defaulted, + RandomAccessIter>::value, ""); +static_assert(IsAdaptedIterCategorySame<pointer_iterator_defaulted, + BidiIter>::value, ""); + TEST(PointeeIteratorTest, Basic) { int arr[4] = {1, 2, 3, 4}; SmallVector<int *, 4> V; |