diff options
| author | David Blaikie <dblaikie@gmail.com> | 2018-11-14 07:19:21 +0000 |
|---|---|---|
| committer | David Blaikie <dblaikie@gmail.com> | 2018-11-14 07:19:21 +0000 |
| commit | dd1a9280622d4eb2ae752d48cbc1d605e0833285 (patch) | |
| tree | 4491805c79fc59e5ea943d3714ffb9f896c436a5 /llvm/unittests | |
| parent | 2bcc9517c548bafb10025af6c871657e98262db2 (diff) | |
| download | bcm5719-llvm-dd1a9280622d4eb2ae752d48cbc1d605e0833285.tar.gz bcm5719-llvm-dd1a9280622d4eb2ae752d48cbc1d605e0833285.zip | |
Correctly instantiate `iterator_adaptor_base` when defining `pointer_iterator`
The definition of `pointer_iterator` omits what should be a `iterator_traits::<>::iterator_category` parameter from `iterator_adaptor_base`. As a result, iterators based on `pointer_iterator` always have defaulted value types and the wrong iterator category.
The definition of `pointee_iterator` just a few lines above does this correctly.
This resolves [[ https://bugs.llvm.org/show_bug.cgi?id=39617 | bug 39617 ]].
Patch by Dylan MacKenzie!
Reviewers: dblaikie
Differential Revision: https://reviews.llvm.org/D54377
llvm-svn: 346833
Diffstat (limited to 'llvm/unittests')
| -rw-r--r-- | llvm/unittests/ADT/IteratorTest.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
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; |

