Skip to content

Commit 075f237

Browse files
committed
[libcxx][ranges] Add indirectly_movable and indirectly_movable_storable.
Differential Revision: https://reviews.llvm.org/D102639
1 parent 6922ab7 commit 075f237

File tree

39 files changed

+468
-26
lines changed

39 files changed

+468
-26
lines changed

libcxx/include/__iterator/concepts.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,6 @@ concept contiguous_iterator =
167167
{ _VSTD::to_address(__i) } -> same_as<add_pointer_t<iter_reference_t<_Ip>>>;
168168
};
169169

170-
171170
template<class _Ip>
172171
concept __has_arrow = input_iterator<_Ip> && (is_pointer_v<_Ip> || requires(_Ip __i) { __i.operator->(); });
173172

@@ -236,6 +235,19 @@ template<class _Fp, class... _Its>
236235
requires (indirectly_readable<_Its> && ...) && invocable<_Fp, iter_reference_t<_Its>...>
237236
using indirect_result_t = invoke_result_t<_Fp, iter_reference_t<_Its>...>;
238237

238+
template<class _In, class _Out>
239+
concept indirectly_movable =
240+
indirectly_readable<_In> &&
241+
indirectly_writable<_Out, iter_rvalue_reference_t<_In>>;
242+
243+
template<class _In, class _Out>
244+
concept indirectly_movable_storable =
245+
indirectly_movable<_In, _Out> &&
246+
indirectly_writable<_Out, iter_value_t<_In>> &&
247+
movable<iter_value_t<_In>> &&
248+
constructible_from<iter_value_t<_In>, iter_rvalue_reference_t<_In>> &&
249+
assignable_from<iter_value_t<_In>&, iter_rvalue_reference_t<_In>>;
250+
239251
// clang-format on
240252

241253
#endif // !defined(_LIBCPP_HAS_NO_RANGES)

libcxx/include/iterator

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,13 @@ template<indirectly_readable I, indirectly_regular_unary_invocable<I> Proj>
125125
template<weakly_incrementable I, indirectly_regular_unary_invocable<I> Proj>
126126
struct incrementable_traits<projected<I, Proj>>; // since C++20
127127
128+
// [alg.req.ind.move], concept indirectly_movable
129+
template<class In, class Out>
130+
concept indirectly_movable = see below; // since C++20
131+
132+
template<class In, class Out>
133+
concept indirectly_movable_storable = see below; // since C++20
134+
128135
template<class Category, class T, class Distance = ptrdiff_t,
129136
class Pointer = T*, class Reference = T&>
130137
struct iterator // deprecated in C++17

libcxx/test/std/containers/associative/map/iterator_concept_conformance.compile.pass.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ static_assert(!std::sized_sentinel_for<iterator, iterator>);
3333
static_assert(!std::sized_sentinel_for<iterator, const_iterator>);
3434
static_assert(!std::sized_sentinel_for<iterator, reverse_iterator>);
3535
static_assert(!std::sized_sentinel_for<iterator, const_reverse_iterator>);
36+
static_assert( std::indirectly_movable<iterator, std::pair<int, int>*>);
37+
static_assert(!std::indirectly_movable_storable<iterator, std::pair<int, int>*>);
3638

3739
static_assert(std::bidirectional_iterator<const_iterator>);
3840
static_assert(!std::random_access_iterator<const_iterator>);

libcxx/test/std/containers/associative/multimap/iterator_concept_conformance.compile.pass.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ static_assert(!std::sized_sentinel_for<iterator, iterator>);
3333
static_assert(!std::sized_sentinel_for<iterator, const_iterator>);
3434
static_assert(!std::sized_sentinel_for<iterator, reverse_iterator>);
3535
static_assert(!std::sized_sentinel_for<iterator, const_reverse_iterator>);
36+
static_assert( std::indirectly_movable<iterator, std::pair<int, int>*>);
37+
static_assert(!std::indirectly_movable_storable<iterator, std::pair<int, int>*>);
3638

3739
static_assert(std::bidirectional_iterator<const_iterator>);
3840
static_assert(!std::random_access_iterator<const_iterator>);

libcxx/test/std/containers/associative/multiset/iterator_concept_conformance.compile.pass.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ static_assert(!std::sized_sentinel_for<iterator, iterator>);
3333
static_assert(!std::sized_sentinel_for<iterator, const_iterator>);
3434
static_assert(!std::sized_sentinel_for<iterator, reverse_iterator>);
3535
static_assert(!std::sized_sentinel_for<iterator, const_reverse_iterator>);
36+
static_assert(std::indirectly_movable<iterator, int*>);
37+
static_assert(std::indirectly_movable_storable<iterator, int*>);
3638

3739
static_assert(std::bidirectional_iterator<const_iterator>);
3840
static_assert(!std::random_access_iterator<const_iterator>);

libcxx/test/std/containers/associative/set/iterator_concept_conformance.compile.pass.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ static_assert(!std::sized_sentinel_for<iterator, iterator>);
3333
static_assert(!std::sized_sentinel_for<iterator, const_iterator>);
3434
static_assert(!std::sized_sentinel_for<iterator, reverse_iterator>);
3535
static_assert(!std::sized_sentinel_for<iterator, const_reverse_iterator>);
36+
static_assert(std::indirectly_movable<iterator, int*>);
37+
static_assert(std::indirectly_movable_storable<iterator, int*>);
3638

3739
static_assert(std::bidirectional_iterator<const_iterator>);
3840
static_assert(!std::random_access_iterator<const_iterator>);

libcxx/test/std/containers/sequences/array/iterator_concept_conformance.compile.pass.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,14 @@ static_assert(std::sized_sentinel_for<iterator, iterator>);
3131
static_assert(std::sized_sentinel_for<iterator, const_iterator>);
3232
static_assert(!std::sized_sentinel_for<iterator, reverse_iterator>);
3333
static_assert(!std::sized_sentinel_for<iterator, const_reverse_iterator>);
34+
static_assert( std::indirectly_movable<iterator, iterator>);
35+
static_assert( std::indirectly_movable_storable<iterator, iterator>);
36+
static_assert(!std::indirectly_movable<iterator, const_iterator>);
37+
static_assert(!std::indirectly_movable_storable<iterator, const_iterator>);
38+
static_assert( std::indirectly_movable<iterator, reverse_iterator>);
39+
static_assert( std::indirectly_movable_storable<iterator, reverse_iterator>);
40+
static_assert(!std::indirectly_movable<iterator, const_reverse_iterator>);
41+
static_assert(!std::indirectly_movable_storable<iterator, const_reverse_iterator>);
3442

3543
static_assert(std::contiguous_iterator<const_iterator>);
3644
static_assert(!std::indirectly_writable<const_iterator, int>);
@@ -42,3 +50,11 @@ static_assert(std::sized_sentinel_for<const_iterator, iterator>);
4250
static_assert(std::sized_sentinel_for<const_iterator, const_iterator>);
4351
static_assert(!std::sized_sentinel_for<const_iterator, reverse_iterator>);
4452
static_assert(!std::sized_sentinel_for<const_iterator, const_reverse_iterator>);
53+
static_assert( std::indirectly_movable<const_iterator, iterator>);
54+
static_assert( std::indirectly_movable_storable<const_iterator, iterator>);
55+
static_assert(!std::indirectly_movable<const_iterator, const_iterator>);
56+
static_assert(!std::indirectly_movable_storable<const_iterator, const_iterator>);
57+
static_assert( std::indirectly_movable<const_iterator, reverse_iterator>);
58+
static_assert( std::indirectly_movable_storable<const_iterator, reverse_iterator>);
59+
static_assert(!std::indirectly_movable<const_iterator, const_reverse_iterator>);
60+
static_assert(!std::indirectly_movable_storable<const_iterator, const_reverse_iterator>);

libcxx/test/std/containers/sequences/deque/iterator_concept_conformance.compile.pass.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,14 @@ static_assert(std::sized_sentinel_for<iterator, iterator>);
3333
static_assert(std::sized_sentinel_for<iterator, const_iterator>);
3434
static_assert(!std::sized_sentinel_for<iterator, reverse_iterator>);
3535
static_assert(!std::sized_sentinel_for<iterator, const_reverse_iterator>);
36+
static_assert( std::indirectly_movable<iterator, iterator>);
37+
static_assert( std::indirectly_movable_storable<iterator, iterator>);
38+
static_assert(!std::indirectly_movable<iterator, const_iterator>);
39+
static_assert(!std::indirectly_movable_storable<iterator, const_iterator>);
40+
static_assert( std::indirectly_movable<iterator, reverse_iterator>);
41+
static_assert( std::indirectly_movable_storable<iterator, reverse_iterator>);
42+
static_assert(!std::indirectly_movable<iterator, const_reverse_iterator>);
43+
static_assert(!std::indirectly_movable_storable<iterator, const_reverse_iterator>);
3644

3745
static_assert(std::random_access_iterator<const_iterator>);
3846
static_assert(!std::contiguous_iterator<const_iterator>);
@@ -45,3 +53,11 @@ static_assert(std::sized_sentinel_for<const_iterator, iterator>);
4553
static_assert(std::sized_sentinel_for<const_iterator, const_iterator>);
4654
static_assert(!std::sized_sentinel_for<const_iterator, reverse_iterator>);
4755
static_assert(!std::sized_sentinel_for<const_iterator, const_reverse_iterator>);
56+
static_assert( std::indirectly_movable<const_iterator, iterator>);
57+
static_assert( std::indirectly_movable_storable<const_iterator, iterator>);
58+
static_assert(!std::indirectly_movable<const_iterator, const_iterator>);
59+
static_assert(!std::indirectly_movable_storable<const_iterator, const_iterator>);
60+
static_assert( std::indirectly_movable<const_iterator, reverse_iterator>);
61+
static_assert( std::indirectly_movable_storable<const_iterator, reverse_iterator>);
62+
static_assert(!std::indirectly_movable<const_iterator, const_reverse_iterator>);
63+
static_assert(!std::indirectly_movable_storable<const_iterator, const_reverse_iterator>);

libcxx/test/std/containers/sequences/forwardlist/forwardlist.iter/iterator_concept_conformance.compile.pass.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ static_assert(std::sentinel_for<iterator, iterator>);
2727
static_assert(std::sentinel_for<iterator, const_iterator>);
2828
static_assert(!std::sized_sentinel_for<iterator, iterator>);
2929
static_assert(!std::sized_sentinel_for<iterator, const_iterator>);
30+
static_assert( std::indirectly_movable<iterator, iterator>);
31+
static_assert( std::indirectly_movable_storable<iterator, iterator>);
32+
static_assert(!std::indirectly_movable<iterator, const_iterator>);
33+
static_assert(!std::indirectly_movable_storable<iterator, const_iterator>);
3034

3135
static_assert(std::forward_iterator<const_iterator>);
3236
static_assert(!std::bidirectional_iterator<const_iterator>);
@@ -35,3 +39,7 @@ static_assert(std::sentinel_for<const_iterator, iterator>);
3539
static_assert(std::sentinel_for<const_iterator, const_iterator>);
3640
static_assert(!std::sized_sentinel_for<const_iterator, iterator>);
3741
static_assert(!std::sized_sentinel_for<const_iterator, const_iterator>);
42+
static_assert( std::indirectly_movable<const_iterator, iterator>);
43+
static_assert( std::indirectly_movable_storable<const_iterator, iterator>);
44+
static_assert(!std::indirectly_movable<const_iterator, const_iterator>);
45+
static_assert(!std::indirectly_movable_storable<const_iterator, const_iterator>);

libcxx/test/std/containers/sequences/list/iterator_concept_conformance.compile.pass.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,14 @@ static_assert(!std::sized_sentinel_for<iterator, iterator>);
3333
static_assert(!std::sized_sentinel_for<iterator, const_iterator>);
3434
static_assert(!std::sized_sentinel_for<iterator, reverse_iterator>);
3535
static_assert(!std::sized_sentinel_for<iterator, const_reverse_iterator>);
36+
static_assert( std::indirectly_movable<iterator, iterator>);
37+
static_assert( std::indirectly_movable_storable<iterator, iterator>);
38+
static_assert(!std::indirectly_movable<iterator, const_iterator>);
39+
static_assert(!std::indirectly_movable_storable<iterator, const_iterator>);
40+
static_assert( std::indirectly_movable<iterator, reverse_iterator>);
41+
static_assert( std::indirectly_movable_storable<iterator, reverse_iterator>);
42+
static_assert(!std::indirectly_movable<iterator, const_reverse_iterator>);
43+
static_assert(!std::indirectly_movable_storable<iterator, const_reverse_iterator>);
3644

3745
static_assert(std::bidirectional_iterator<const_iterator>);
3846
static_assert(!std::random_access_iterator<const_iterator>);
@@ -45,3 +53,11 @@ static_assert(!std::sized_sentinel_for<const_iterator, iterator>);
4553
static_assert(!std::sized_sentinel_for<const_iterator, const_iterator>);
4654
static_assert(!std::sized_sentinel_for<const_iterator, reverse_iterator>);
4755
static_assert(!std::sized_sentinel_for<const_iterator, const_reverse_iterator>);
56+
static_assert( std::indirectly_movable<const_iterator, iterator>);
57+
static_assert( std::indirectly_movable_storable<const_iterator, iterator>);
58+
static_assert(!std::indirectly_movable<const_iterator, const_iterator>);
59+
static_assert(!std::indirectly_movable_storable<const_iterator, const_iterator>);
60+
static_assert( std::indirectly_movable<const_iterator, reverse_iterator>);
61+
static_assert( std::indirectly_movable_storable<const_iterator, reverse_iterator>);
62+
static_assert(!std::indirectly_movable<const_iterator, const_reverse_iterator>);
63+
static_assert(!std::indirectly_movable_storable<const_iterator, const_reverse_iterator>);

libcxx/test/std/containers/sequences/vector.bool/iterator_concept_conformance.compile.pass.cpp

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,30 +22,32 @@ using reverse_iterator = std::vector<bool>::reverse_iterator;
2222
using const_reverse_iterator = std::vector<bool>::const_reverse_iterator;
2323
using value_type = bool;
2424

25-
static_assert(std::random_access_iterator<iterator>);
26-
static_assert(std::random_access_iterator<reverse_iterator>);
25+
static_assert( std::random_access_iterator<iterator>);
26+
static_assert( std::random_access_iterator<reverse_iterator>);
2727
static_assert(!std::contiguous_iterator<iterator>);
2828
static_assert(!std::contiguous_iterator<reverse_iterator>);
2929
static_assert(!std::indirectly_writable<iterator, value_type>);
30-
static_assert(std::sentinel_for<iterator, iterator>);
31-
static_assert(std::sentinel_for<iterator, const_iterator>);
30+
static_assert( std::sentinel_for<iterator, iterator>);
31+
static_assert( std::sentinel_for<iterator, const_iterator>);
3232
static_assert(!std::sentinel_for<iterator, reverse_iterator>);
3333
static_assert(!std::sentinel_for<iterator, const_reverse_iterator>);
34-
static_assert(std::sized_sentinel_for<iterator, iterator>);
35-
static_assert(std::sized_sentinel_for<iterator, const_iterator>);
34+
static_assert( std::sized_sentinel_for<iterator, iterator>);
35+
static_assert( std::sized_sentinel_for<iterator, const_iterator>);
3636
static_assert(!std::sized_sentinel_for<iterator, reverse_iterator>);
3737
static_assert(!std::sized_sentinel_for<iterator, const_reverse_iterator>);
38+
static_assert(std::indirectly_movable<iterator, bool*>);
39+
static_assert(std::indirectly_movable_storable<iterator, bool*>);
3840

39-
static_assert(std::random_access_iterator<const_iterator>);
40-
static_assert(std::random_access_iterator<const_reverse_iterator>);
41+
static_assert( std::random_access_iterator<const_iterator>);
42+
static_assert( std::random_access_iterator<const_reverse_iterator>);
4143
static_assert(!std::contiguous_iterator<const_iterator>);
4244
static_assert(!std::contiguous_iterator<const_reverse_iterator>);
4345
static_assert(!std::indirectly_writable<const_iterator, value_type>);
44-
static_assert(std::sentinel_for<const_iterator, iterator>);
45-
static_assert(std::sentinel_for<const_iterator, const_iterator>);
46+
static_assert( std::sentinel_for<const_iterator, iterator>);
47+
static_assert( std::sentinel_for<const_iterator, const_iterator>);
4648
static_assert(!std::sentinel_for<const_iterator, reverse_iterator>);
4749
static_assert(!std::sentinel_for<const_iterator, const_reverse_iterator>);
48-
static_assert(std::sized_sentinel_for<const_iterator, iterator>);
49-
static_assert(std::sized_sentinel_for<const_iterator, const_iterator>);
50+
static_assert( std::sized_sentinel_for<const_iterator, iterator>);
51+
static_assert( std::sized_sentinel_for<const_iterator, const_iterator>);
5052
static_assert(!std::sized_sentinel_for<const_iterator, reverse_iterator>);
5153
static_assert(!std::sized_sentinel_for<const_iterator, const_reverse_iterator>);

libcxx/test/std/containers/sequences/vector/iterator_concept_conformance.compile.pass.cpp

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,28 +22,44 @@ using reverse_iterator = std::vector<int>::reverse_iterator;
2222
using const_reverse_iterator = std::vector<int>::const_reverse_iterator;
2323
using value_type = int;
2424

25-
static_assert(std::contiguous_iterator<iterator>);
26-
static_assert(std::random_access_iterator<reverse_iterator>);
25+
static_assert( std::contiguous_iterator<iterator>);
26+
static_assert( std::random_access_iterator<reverse_iterator>);
2727
static_assert(!std::contiguous_iterator<reverse_iterator>);
28-
static_assert(std::indirectly_writable<iterator, value_type>);
29-
static_assert(std::sentinel_for<iterator, iterator>);
30-
static_assert(std::sentinel_for<iterator, const_iterator>);
28+
static_assert( std::indirectly_writable<iterator, value_type>);
29+
static_assert( std::sentinel_for<iterator, iterator>);
30+
static_assert( std::sentinel_for<iterator, const_iterator>);
3131
static_assert(!std::sentinel_for<iterator, reverse_iterator>);
3232
static_assert(!std::sentinel_for<iterator, const_reverse_iterator>);
33-
static_assert(std::sized_sentinel_for<iterator, iterator>);
34-
static_assert(std::sized_sentinel_for<iterator, const_iterator>);
33+
static_assert( std::sized_sentinel_for<iterator, iterator>);
34+
static_assert( std::sized_sentinel_for<iterator, const_iterator>);
3535
static_assert(!std::sized_sentinel_for<iterator, reverse_iterator>);
3636
static_assert(!std::sized_sentinel_for<iterator, const_reverse_iterator>);
37+
static_assert( std::indirectly_movable<iterator, iterator>);
38+
static_assert( std::indirectly_movable_storable<iterator, iterator>);
39+
static_assert(!std::indirectly_movable<iterator, const_iterator>);
40+
static_assert(!std::indirectly_movable_storable<iterator, const_iterator>);
41+
static_assert( std::indirectly_movable<iterator, reverse_iterator>);
42+
static_assert( std::indirectly_movable_storable<iterator, reverse_iterator>);
43+
static_assert(!std::indirectly_movable<iterator, const_reverse_iterator>);
44+
static_assert(!std::indirectly_movable_storable<iterator, const_reverse_iterator>);
3745

38-
static_assert(std::contiguous_iterator<const_iterator>);
39-
static_assert(std::random_access_iterator<const_reverse_iterator>);
46+
static_assert( std::contiguous_iterator<const_iterator>);
47+
static_assert( std::random_access_iterator<const_reverse_iterator>);
4048
static_assert(!std::contiguous_iterator<const_reverse_iterator>);
4149
static_assert(!std::indirectly_writable<const_iterator, value_type>);
42-
static_assert(std::sentinel_for<const_iterator, iterator>);
43-
static_assert(std::sentinel_for<const_iterator, const_iterator>);
50+
static_assert( std::sentinel_for<const_iterator, iterator>);
51+
static_assert( std::sentinel_for<const_iterator, const_iterator>);
4452
static_assert(!std::sentinel_for<const_iterator, reverse_iterator>);
4553
static_assert(!std::sentinel_for<const_iterator, const_reverse_iterator>);
46-
static_assert(std::sized_sentinel_for<const_iterator, iterator>);
47-
static_assert(std::sized_sentinel_for<const_iterator, const_iterator>);
54+
static_assert( std::sized_sentinel_for<const_iterator, iterator>);
55+
static_assert( std::sized_sentinel_for<const_iterator, const_iterator>);
4856
static_assert(!std::sized_sentinel_for<const_iterator, reverse_iterator>);
4957
static_assert(!std::sized_sentinel_for<const_iterator, const_reverse_iterator>);
58+
static_assert( std::indirectly_movable<const_iterator, iterator>);
59+
static_assert( std::indirectly_movable_storable<const_iterator, iterator>);
60+
static_assert(!std::indirectly_movable<const_iterator, const_iterator>);
61+
static_assert(!std::indirectly_movable_storable<const_iterator, const_iterator>);
62+
static_assert( std::indirectly_movable<const_iterator, reverse_iterator>);
63+
static_assert( std::indirectly_movable_storable<const_iterator, reverse_iterator>);
64+
static_assert(!std::indirectly_movable<const_iterator, const_reverse_iterator>);
65+
static_assert(!std::indirectly_movable_storable<const_iterator, const_reverse_iterator>);

libcxx/test/std/containers/unord/unord.map/iterator_concept_conformance.compile.pass.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ static_assert(!std::sized_sentinel_for<iterator, iterator>);
3333
static_assert(!std::sized_sentinel_for<iterator, const_iterator>);
3434
static_assert(!std::sized_sentinel_for<iterator, local_iterator>);
3535
static_assert(!std::sized_sentinel_for<iterator, const_local_iterator>);
36+
static_assert(std::indirectly_movable<iterator, std::pair<int, int>*>);
37+
static_assert(!std::indirectly_movable_storable<iterator, std::pair<int, int>*>);
3638

3739
static_assert(std::forward_iterator<const_iterator>);
3840
static_assert(!std::bidirectional_iterator<const_iterator>);
@@ -57,6 +59,8 @@ static_assert(!std::sized_sentinel_for<local_iterator, iterator>);
5759
static_assert(!std::sized_sentinel_for<local_iterator, const_iterator>);
5860
static_assert(!std::sized_sentinel_for<local_iterator, local_iterator>);
5961
static_assert(!std::sized_sentinel_for<local_iterator, const_local_iterator>);
62+
static_assert(std::indirectly_movable<local_iterator, std::pair<int, int>*>);
63+
static_assert(!std::indirectly_movable_storable<local_iterator, std::pair<int, int>*>);
6064

6165
static_assert(std::forward_iterator<const_local_iterator>);
6266
static_assert(!std::bidirectional_iterator<const_local_iterator>);

libcxx/test/std/containers/unord/unord.multimap/iterator_concept_conformance.compile.pass.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ static_assert(!std::sized_sentinel_for<iterator, iterator>);
3333
static_assert(!std::sized_sentinel_for<iterator, const_iterator>);
3434
static_assert(!std::sized_sentinel_for<iterator, local_iterator>);
3535
static_assert(!std::sized_sentinel_for<iterator, const_local_iterator>);
36+
static_assert(std::indirectly_movable<iterator, std::pair<int, int>*>);
37+
static_assert(!std::indirectly_movable_storable<iterator, std::pair<int, int>*>);
3638

3739
static_assert(std::forward_iterator<const_iterator>);
3840
static_assert(!std::bidirectional_iterator<const_iterator>);
@@ -57,6 +59,8 @@ static_assert(!std::sized_sentinel_for<local_iterator, iterator>);
5759
static_assert(!std::sized_sentinel_for<local_iterator, const_iterator>);
5860
static_assert(!std::sized_sentinel_for<local_iterator, local_iterator>);
5961
static_assert(!std::sized_sentinel_for<local_iterator, const_local_iterator>);
62+
static_assert(std::indirectly_movable<local_iterator, std::pair<int, int>*>);
63+
static_assert(!std::indirectly_movable_storable<local_iterator, std::pair<int, int>*>);
6064

6165
static_assert(std::forward_iterator<const_local_iterator>);
6266
static_assert(!std::bidirectional_iterator<const_local_iterator>);

0 commit comments

Comments
 (0)