diff --git a/libcxx/docs/OneRangesProposalStatus.csv b/libcxx/docs/OneRangesProposalStatus.csv --- a/libcxx/docs/OneRangesProposalStatus.csv +++ b/libcxx/docs/OneRangesProposalStatus.csv @@ -61,7 +61,7 @@ | indirectly_copyable | indirectly_copyable_storable",[iterator.concepts],Zoe Carver,In progress [common.alg.req]: pt. 2,indirectly_swappable,"| [iterator.concepts] -| [iterator.cust.swap]",Louis Dionne,Not started +| [iterator.cust.swap]",Zoe Carver,✅ [common.alg.req]: pt. 3,indirectly_comparable,[projected],Louis Dionne,Not started [common.alg.req]: pt. 4,"| permutable | mergeable diff --git a/libcxx/include/__iterator/concepts.h b/libcxx/include/__iterator/concepts.h --- a/libcxx/include/__iterator/concepts.h +++ b/libcxx/include/__iterator/concepts.h @@ -249,6 +249,9 @@ constructible_from, iter_rvalue_reference_t<_In>> && assignable_from&, iter_rvalue_reference_t<_In>>; +// Note: indirectly_swappable is located in iter_swap.h to prevent a dependency cycle +// (both iter_swap and indirectly_swappable require indirectly_readable). + // clang-format on #endif // !defined(_LIBCPP_HAS_NO_RANGES) diff --git a/libcxx/include/__iterator/iter_swap.h b/libcxx/include/__iterator/iter_swap.h --- a/libcxx/include/__iterator/iter_swap.h +++ b/libcxx/include/__iterator/iter_swap.h @@ -85,6 +85,16 @@ } // namespace ranges +template +concept indirectly_swappable = + indirectly_readable<_I1> && indirectly_readable<_I2> && + requires(const _I1 __i1, const _I2 __i2) { + ranges::iter_swap(__i1, __i1); + ranges::iter_swap(__i2, __i2); + ranges::iter_swap(__i1, __i2); + ranges::iter_swap(__i2, __i1); + }; + #endif // !defined(_LIBCPP_HAS_NO_RANGES) _LIBCPP_END_NAMESPACE_STD diff --git a/libcxx/include/iterator b/libcxx/include/iterator --- a/libcxx/include/iterator +++ b/libcxx/include/iterator @@ -132,6 +132,10 @@ template concept indirectly_movable_storable = see below; // since C++20 +// [alg.req.ind.swap], concept indirectly_swappable +template + concept indirectly_swappable = see below; // since C++20 + template struct iterator // deprecated in C++17 diff --git a/libcxx/test/std/containers/associative/map/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/associative/map/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/associative/map/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/associative/map/iterator_concept_conformance.compile.pass.cpp @@ -35,6 +35,7 @@ static_assert(!std::sized_sentinel_for); static_assert( std::indirectly_movable*>); static_assert(!std::indirectly_movable_storable*>); +static_assert(!std::indirectly_swappable); static_assert(std::bidirectional_iterator); static_assert(!std::random_access_iterator); @@ -47,3 +48,4 @@ static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); +static_assert(!std::indirectly_swappable); diff --git a/libcxx/test/std/containers/associative/multimap/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/associative/multimap/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/associative/multimap/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/associative/multimap/iterator_concept_conformance.compile.pass.cpp @@ -35,6 +35,7 @@ static_assert(!std::sized_sentinel_for); static_assert( std::indirectly_movable*>); static_assert(!std::indirectly_movable_storable*>); +static_assert(!std::indirectly_swappable); static_assert(std::bidirectional_iterator); static_assert(!std::random_access_iterator); @@ -47,3 +48,4 @@ static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); +static_assert(!std::indirectly_swappable); diff --git a/libcxx/test/std/containers/associative/multiset/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/associative/multiset/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/associative/multiset/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/associative/multiset/iterator_concept_conformance.compile.pass.cpp @@ -35,6 +35,7 @@ static_assert(!std::sized_sentinel_for); static_assert(std::indirectly_movable); static_assert(std::indirectly_movable_storable); +static_assert(!std::indirectly_swappable); static_assert(std::bidirectional_iterator); static_assert(!std::random_access_iterator); @@ -47,3 +48,4 @@ static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); +static_assert(!std::indirectly_swappable); diff --git a/libcxx/test/std/containers/associative/set/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/associative/set/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/associative/set/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/associative/set/iterator_concept_conformance.compile.pass.cpp @@ -35,6 +35,7 @@ static_assert(!std::sized_sentinel_for); static_assert(std::indirectly_movable); static_assert(std::indirectly_movable_storable); +static_assert(!std::indirectly_swappable); static_assert(std::bidirectional_iterator); static_assert(!std::random_access_iterator); @@ -47,3 +48,4 @@ static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); +static_assert(!std::indirectly_swappable); diff --git a/libcxx/test/std/containers/sequences/array/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/array/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/sequences/array/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/sequences/array/iterator_concept_conformance.compile.pass.cpp @@ -39,6 +39,7 @@ static_assert( std::indirectly_movable_storable); static_assert(!std::indirectly_movable); static_assert(!std::indirectly_movable_storable); +static_assert( std::indirectly_swappable); static_assert(std::contiguous_iterator); static_assert(!std::indirectly_writable); @@ -58,3 +59,4 @@ static_assert( std::indirectly_movable_storable); static_assert(!std::indirectly_movable); static_assert(!std::indirectly_movable_storable); +static_assert(!std::indirectly_swappable); diff --git a/libcxx/test/std/containers/sequences/deque/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/deque/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/sequences/deque/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/sequences/deque/iterator_concept_conformance.compile.pass.cpp @@ -41,6 +41,7 @@ static_assert( std::indirectly_movable_storable); static_assert(!std::indirectly_movable); static_assert(!std::indirectly_movable_storable); +static_assert(std::indirectly_swappable); static_assert(std::random_access_iterator); static_assert(!std::contiguous_iterator); @@ -61,3 +62,4 @@ static_assert( std::indirectly_movable_storable); static_assert(!std::indirectly_movable); static_assert(!std::indirectly_movable_storable); +static_assert(!std::indirectly_swappable); diff --git a/libcxx/test/std/containers/sequences/forwardlist/forwardlist.iter/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/forwardlist/forwardlist.iter/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/sequences/forwardlist/forwardlist.iter/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/sequences/forwardlist/forwardlist.iter/iterator_concept_conformance.compile.pass.cpp @@ -31,6 +31,7 @@ static_assert( std::indirectly_movable_storable); static_assert(!std::indirectly_movable); static_assert(!std::indirectly_movable_storable); +static_assert(std::indirectly_swappable); static_assert(std::forward_iterator); static_assert(!std::bidirectional_iterator); @@ -43,3 +44,4 @@ static_assert( std::indirectly_movable_storable); static_assert(!std::indirectly_movable); static_assert(!std::indirectly_movable_storable); +static_assert(!std::indirectly_swappable); diff --git a/libcxx/test/std/containers/sequences/list/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/list/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/sequences/list/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/sequences/list/iterator_concept_conformance.compile.pass.cpp @@ -41,6 +41,7 @@ static_assert( std::indirectly_movable_storable); static_assert(!std::indirectly_movable); static_assert(!std::indirectly_movable_storable); +static_assert(std::indirectly_swappable); static_assert(std::bidirectional_iterator); static_assert(!std::random_access_iterator); @@ -61,3 +62,4 @@ static_assert( std::indirectly_movable_storable); static_assert(!std::indirectly_movable); static_assert(!std::indirectly_movable_storable); +static_assert(!std::indirectly_swappable); diff --git a/libcxx/test/std/containers/sequences/vector.bool/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/vector.bool/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/sequences/vector.bool/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/sequences/vector.bool/iterator_concept_conformance.compile.pass.cpp @@ -37,6 +37,7 @@ static_assert(!std::sized_sentinel_for); static_assert(std::indirectly_movable); static_assert(std::indirectly_movable_storable); +static_assert(std::indirectly_swappable); static_assert( std::random_access_iterator); static_assert( std::random_access_iterator); @@ -51,3 +52,4 @@ static_assert( std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); +static_assert(!std::indirectly_swappable); diff --git a/libcxx/test/std/containers/sequences/vector/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/vector/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/sequences/vector/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/sequences/vector/iterator_concept_conformance.compile.pass.cpp @@ -42,6 +42,7 @@ static_assert( std::indirectly_movable_storable); static_assert(!std::indirectly_movable); static_assert(!std::indirectly_movable_storable); +static_assert(std::indirectly_swappable); static_assert( std::contiguous_iterator); static_assert( std::random_access_iterator); @@ -63,3 +64,4 @@ static_assert( std::indirectly_movable_storable); static_assert(!std::indirectly_movable); static_assert(!std::indirectly_movable_storable); +static_assert(!std::indirectly_swappable); diff --git a/libcxx/test/std/containers/unord/unord.map/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/unord/unord.map/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/unord/unord.map/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.map/iterator_concept_conformance.compile.pass.cpp @@ -35,6 +35,7 @@ static_assert(!std::sized_sentinel_for); static_assert(std::indirectly_movable*>); static_assert(!std::indirectly_movable_storable*>); +static_assert(!std::indirectly_swappable); static_assert(std::forward_iterator); static_assert(!std::bidirectional_iterator); @@ -47,6 +48,7 @@ static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); +static_assert(!std::indirectly_swappable); static_assert(std::forward_iterator); static_assert(!std::bidirectional_iterator); @@ -61,6 +63,7 @@ static_assert(!std::sized_sentinel_for); static_assert(std::indirectly_movable*>); static_assert(!std::indirectly_movable_storable*>); +static_assert(!std::indirectly_swappable); static_assert(std::forward_iterator); static_assert(!std::bidirectional_iterator); @@ -73,3 +76,4 @@ static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); +static_assert(!std::indirectly_swappable); diff --git a/libcxx/test/std/containers/unord/unord.multimap/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/unord/unord.multimap/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/unord/unord.multimap/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.multimap/iterator_concept_conformance.compile.pass.cpp @@ -35,6 +35,7 @@ static_assert(!std::sized_sentinel_for); static_assert(std::indirectly_movable*>); static_assert(!std::indirectly_movable_storable*>); +static_assert(!std::indirectly_swappable); static_assert(std::forward_iterator); static_assert(!std::bidirectional_iterator); @@ -47,6 +48,7 @@ static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); +static_assert(!std::indirectly_swappable); static_assert(std::forward_iterator); static_assert(!std::bidirectional_iterator); @@ -61,6 +63,7 @@ static_assert(!std::sized_sentinel_for); static_assert(std::indirectly_movable*>); static_assert(!std::indirectly_movable_storable*>); +static_assert(!std::indirectly_swappable); static_assert(std::forward_iterator); static_assert(!std::bidirectional_iterator); @@ -73,3 +76,4 @@ static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); +static_assert(!std::indirectly_swappable); diff --git a/libcxx/test/std/containers/unord/unord.multiset/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/unord/unord.multiset/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/unord/unord.multiset/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.multiset/iterator_concept_conformance.compile.pass.cpp @@ -35,6 +35,7 @@ static_assert(!std::sized_sentinel_for); static_assert(std::indirectly_movable); static_assert(std::indirectly_movable_storable); +static_assert(!std::indirectly_swappable); static_assert(std::forward_iterator); static_assert(!std::bidirectional_iterator); @@ -47,6 +48,7 @@ static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); +static_assert(!std::indirectly_swappable); static_assert(std::forward_iterator); static_assert(!std::bidirectional_iterator); @@ -61,6 +63,7 @@ static_assert(!std::sized_sentinel_for); static_assert(std::indirectly_movable); static_assert(std::indirectly_movable_storable); +static_assert(!std::indirectly_swappable); static_assert(std::forward_iterator); static_assert(!std::bidirectional_iterator); @@ -73,3 +76,4 @@ static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); +static_assert(!std::indirectly_swappable); diff --git a/libcxx/test/std/containers/unord/unord.set/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/unord/unord.set/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/unord/unord.set/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.set/iterator_concept_conformance.compile.pass.cpp @@ -35,6 +35,7 @@ static_assert(!std::sized_sentinel_for); static_assert(std::indirectly_movable); static_assert(std::indirectly_movable_storable); +static_assert(!std::indirectly_swappable); static_assert(std::forward_iterator); static_assert(!std::bidirectional_iterator); @@ -47,6 +48,7 @@ static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); +static_assert(!std::indirectly_swappable); static_assert(std::forward_iterator); static_assert(!std::bidirectional_iterator); @@ -60,6 +62,7 @@ static_assert(!std::sized_sentinel_for); static_assert(std::indirectly_movable); static_assert(std::indirectly_movable_storable); +static_assert(!std::indirectly_swappable); static_assert(std::forward_iterator); static_assert(!std::bidirectional_iterator); @@ -72,3 +75,4 @@ static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); +static_assert(!std::indirectly_swappable); diff --git a/libcxx/test/std/containers/views/span.iterators/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/views/span.iterators/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/views/span.iterators/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/views/span.iterators/iterator_concept_conformance.compile.pass.cpp @@ -28,3 +28,4 @@ static_assert(!std::sized_sentinel_for); static_assert(std::indirectly_movable); static_assert(std::indirectly_movable_storable); +static_assert(std::indirectly_swappable); diff --git a/libcxx/test/std/input.output/filesystems/class.directory_iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/input.output/filesystems/class.directory_iterator/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/input.output/filesystems/class.directory_iterator/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/input.output/filesystems/class.directory_iterator/iterator_concept_conformance.compile.pass.cpp @@ -26,6 +26,7 @@ static_assert(!std::sized_sentinel_for); static_assert(!std::indirectly_movable); static_assert(!std::indirectly_movable_storable); +static_assert(!std::indirectly_swappable); static_assert(std::input_iterator); static_assert(!std::forward_iterator); @@ -35,3 +36,4 @@ static_assert(!std::sized_sentinel_for); static_assert(!std::indirectly_movable); static_assert(!std::indirectly_movable_storable); +static_assert(!std::indirectly_swappable); diff --git a/libcxx/test/std/iterators/iterator.requirements/alg.req.ind.swap/indirectly_swappable.compile.pass.cpp b/libcxx/test/std/iterators/iterator.requirements/alg.req.ind.swap/indirectly_swappable.compile.pass.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/std/iterators/iterator.requirements/alg.req.ind.swap/indirectly_swappable.compile.pass.cpp @@ -0,0 +1,80 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 +// UNSUPPORTED: libcpp-no-concepts +// UNSUPPORTED: gcc-10 + +// template +// concept indirectly_swappable; + +#include + +#include "test_macros.h" + +template +struct PointerTo { + using value_type = ValueType; + T& operator*() const; +}; + +static_assert(std::indirectly_swappable>); +static_assert(std::indirectly_swappable, PointerTo>); + +struct B; + +struct A { + friend void iter_swap(const PointerTo&, const PointerTo&); +}; + +// Is indirectly swappable. +struct B { + friend void iter_swap(const PointerTo&, const PointerTo&); + friend void iter_swap(const PointerTo&, const PointerTo&); + friend void iter_swap(const PointerTo&, const PointerTo&); +}; + +// Valid except ranges::iter_swap(i2, i1). +struct C { + friend void iter_swap(const PointerTo&, const PointerTo&); + friend void iter_swap(const PointerTo&, const PointerTo&); + friend void iter_swap(const PointerTo&, const PointerTo&) = delete; +}; + +// Valid except ranges::iter_swap(i1, i2). +struct D { + friend void iter_swap(const PointerTo&, const PointerTo&); + friend void iter_swap(const PointerTo&, const PointerTo&) = delete; + friend void iter_swap(const PointerTo&, const PointerTo&); +}; + +// Valid except ranges::iter_swap(i2, i2). +struct E { + E operator=(const E&) = delete; + friend void iter_swap(const PointerTo&, const PointerTo&) = delete; + friend void iter_swap(const PointerTo&, const PointerTo&); + friend void iter_swap(const PointerTo&, const PointerTo&); +}; + +struct F { + friend void iter_swap(const PointerTo&, const PointerTo&) = delete; +}; + +// Valid except ranges::iter_swap(i1, i1). +struct G { + friend void iter_swap(const PointerTo&, const PointerTo&); + friend void iter_swap(const PointerTo&, const PointerTo&); + friend void iter_swap(const PointerTo&, const PointerTo&); +}; + + +static_assert( std::indirectly_swappable, PointerTo>); +static_assert(!std::indirectly_swappable, PointerTo>); +static_assert(!std::indirectly_swappable, PointerTo>); +static_assert(!std::indirectly_swappable, PointerTo>); +static_assert(!std::indirectly_swappable, PointerTo>); diff --git a/libcxx/test/std/iterators/predef.iterators/move.iterators/move.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/iterator.requirements/alg.req.ind.swap/indirectly_swappable.subsumption.compile.pass.cpp copy from libcxx/test/std/iterators/predef.iterators/move.iterators/move.iterator/iterator_concept_conformance.compile.pass.cpp copy to libcxx/test/std/iterators/iterator.requirements/alg.req.ind.swap/indirectly_swappable.subsumption.compile.pass.cpp --- a/libcxx/test/std/iterators/predef.iterators/move.iterators/move.iterator/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/iterators/iterator.requirements/alg.req.ind.swap/indirectly_swappable.subsumption.compile.pass.cpp @@ -10,18 +10,23 @@ // UNSUPPORTED: libcpp-no-concepts // UNSUPPORTED: gcc-10 -// move_iterator +// template +// concept indirectly_swappable; #include -using iterator = std::move_iterator; +#include +template + requires std::indirectly_readable && std::indirectly_readable +constexpr bool indirectly_swappable_subsumption() { + return false; +} -static_assert(std::input_iterator); -static_assert(!std::forward_iterator); -static_assert(!std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::sentinel_for); -static_assert(std::sized_sentinel_for); -static_assert(!std::indirectly_movable); -static_assert(!std::indirectly_movable_storable); +template + requires std::indirectly_swappable +constexpr bool indirectly_swappable_subsumption() { + return true; +} + +static_assert(indirectly_swappable_subsumption()); diff --git a/libcxx/test/std/iterators/predef.iterators/insert.iterators/back.insert.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/predef.iterators/insert.iterators/back.insert.iterator/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/iterators/predef.iterators/insert.iterators/back.insert.iterator/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/insert.iterators/back.insert.iterator/iterator_concept_conformance.compile.pass.cpp @@ -26,3 +26,4 @@ static_assert(!std::input_iterator); static_assert(std::indirectly_movable); static_assert(std::indirectly_movable_storable); +static_assert(!std::indirectly_swappable); diff --git a/libcxx/test/std/iterators/predef.iterators/insert.iterators/front.insert.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/predef.iterators/insert.iterators/front.insert.iterator/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/iterators/predef.iterators/insert.iterators/front.insert.iterator/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/insert.iterators/front.insert.iterator/iterator_concept_conformance.compile.pass.cpp @@ -26,3 +26,4 @@ static_assert(!std::input_iterator); static_assert(std::indirectly_movable); static_assert(std::indirectly_movable_storable); +static_assert(!std::indirectly_swappable); diff --git a/libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iterator/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iterator/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iterator/iterator_concept_conformance.compile.pass.cpp @@ -25,3 +25,4 @@ static_assert(!std::input_iterator); static_assert(std::indirectly_movable); static_assert(std::indirectly_movable_storable); +static_assert(!std::indirectly_swappable); diff --git a/libcxx/test/std/iterators/predef.iterators/move.iterators/move.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/predef.iterators/move.iterators/move.iterator/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/iterators/predef.iterators/move.iterators/move.iterator/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/move.iterators/move.iterator/iterator_concept_conformance.compile.pass.cpp @@ -16,7 +16,6 @@ using iterator = std::move_iterator; - static_assert(std::input_iterator); static_assert(!std::forward_iterator); static_assert(!std::indirectly_writable); @@ -25,3 +24,4 @@ static_assert(std::sized_sentinel_for); static_assert(!std::indirectly_movable); static_assert(!std::indirectly_movable_storable); +static_assert(!std::indirectly_swappable); diff --git a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/iterator_concept_conformance.compile.pass.cpp @@ -32,6 +32,7 @@ static_assert(!std::sized_sentinel_for); static_assert( std::indirectly_movable); static_assert( std::indirectly_movable_storable); +static_assert( std::indirectly_swappable); using reverse_random_access_iterator = std::reverse_iterator>; static_assert(common_reverse_iterator_checks()); @@ -40,6 +41,7 @@ static_assert(std::sized_sentinel_for); static_assert( std::indirectly_movable); static_assert( std::indirectly_movable_storable); +static_assert( std::indirectly_swappable); using reverse_contiguous_iterator = std::reverse_iterator>; static_assert(common_reverse_iterator_checks()); @@ -48,3 +50,4 @@ static_assert(std::sized_sentinel_for); static_assert( std::indirectly_movable); static_assert( std::indirectly_movable_storable); +static_assert( std::indirectly_swappable); diff --git a/libcxx/test/std/iterators/stream.iterators/istream.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/stream.iterators/istream.iterator/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/iterators/stream.iterators/istream.iterator/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/iterators/stream.iterators/istream.iterator/iterator_concept_conformance.compile.pass.cpp @@ -26,3 +26,4 @@ static_assert(std::input_iterator); static_assert(!std::indirectly_movable); static_assert(!std::indirectly_movable_storable); +static_assert(!std::indirectly_swappable); diff --git a/libcxx/test/std/iterators/stream.iterators/istreambuf.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/stream.iterators/istreambuf.iterator/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/iterators/stream.iterators/istreambuf.iterator/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/iterators/stream.iterators/istreambuf.iterator/iterator_concept_conformance.compile.pass.cpp @@ -27,3 +27,4 @@ static_assert(!std::sized_sentinel_for); static_assert(std::indirectly_movable); static_assert(std::indirectly_movable_storable); +static_assert(!std::indirectly_swappable); diff --git a/libcxx/test/std/iterators/stream.iterators/ostream.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/stream.iterators/ostream.iterator/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/iterators/stream.iterators/ostream.iterator/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/iterators/stream.iterators/ostream.iterator/iterator_concept_conformance.compile.pass.cpp @@ -26,3 +26,4 @@ static_assert(!std::input_iterator); static_assert(std::indirectly_movable); static_assert(std::indirectly_movable_storable); +static_assert(!std::indirectly_swappable); diff --git a/libcxx/test/std/iterators/stream.iterators/ostreambuf.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/stream.iterators/ostreambuf.iterator/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/iterators/stream.iterators/ostreambuf.iterator/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/iterators/stream.iterators/ostreambuf.iterator/iterator_concept_conformance.compile.pass.cpp @@ -27,3 +27,4 @@ static_assert(!std::input_iterator); static_assert(std::indirectly_movable); static_assert(std::indirectly_movable_storable); +static_assert(!std::indirectly_swappable); diff --git a/libcxx/test/std/re/re.iter/re.regiter/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/re/re.iter/re.regiter/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/re/re.iter/re.regiter/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/re/re.iter/re.regiter/iterator_concept_conformance.compile.pass.cpp @@ -23,3 +23,4 @@ static_assert(!std::sized_sentinel_for); static_assert(!std::indirectly_movable); static_assert(!std::indirectly_movable_storable); +static_assert(!std::indirectly_swappable); diff --git a/libcxx/test/std/re/re.iter/re.tokiter/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/re/re.iter/re.tokiter/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/re/re.iter/re.tokiter/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/re/re.iter/re.tokiter/iterator_concept_conformance.compile.pass.cpp @@ -23,3 +23,4 @@ static_assert(!std::sized_sentinel_for); static_assert(!std::indirectly_movable); static_assert(!std::indirectly_movable_storable); +static_assert(!std::indirectly_swappable); diff --git a/libcxx/test/std/strings/basic.string/string.iterators/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/strings/basic.string/string.iterators/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/strings/basic.string/string.iterators/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.iterators/iterator_concept_conformance.compile.pass.cpp @@ -40,6 +40,7 @@ static_assert( std::indirectly_movable_storable); static_assert(!std::indirectly_movable); static_assert(!std::indirectly_movable_storable); +static_assert( std::indirectly_swappable); static_assert(std::contiguous_iterator); static_assert(!std::indirectly_writable); @@ -59,3 +60,4 @@ static_assert( std::indirectly_movable_storable); static_assert(!std::indirectly_movable); static_assert(!std::indirectly_movable_storable); +static_assert(!std::indirectly_swappable); diff --git a/libcxx/test/std/strings/string.view/string.view.iterators/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/strings/string.view/string.view.iterators/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/strings/string.view/string.view.iterators/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/strings/string.view/string.view.iterators/iterator_concept_conformance.compile.pass.cpp @@ -33,6 +33,7 @@ static_assert(!std::sized_sentinel_for); static_assert(std::indirectly_movable); static_assert(std::indirectly_movable_storable); +static_assert(!std::indirectly_swappable); static_assert(std::contiguous_iterator); static_assert(!std::indirectly_writable); @@ -44,3 +45,4 @@ static_assert(std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); +static_assert(!std::indirectly_swappable); diff --git a/libcxx/test/std/utilities/memory/unique.ptr/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/utilities/memory/unique.ptr/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/utilities/memory/unique.ptr/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/utilities/memory/unique.ptr/iterator_concept_conformance.compile.pass.cpp @@ -21,6 +21,7 @@ static_assert(!std::weakly_incrementable >); static_assert(std::indirectly_movable, std::unique_ptr>); static_assert(std::indirectly_movable_storable, std::unique_ptr>); +static_assert(std::indirectly_swappable, std::unique_ptr >); static_assert(!std::indirectly_readable >); static_assert(!std::indirectly_writable, void>); diff --git a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/iterator_concept_conformance.compile.pass.cpp @@ -21,6 +21,7 @@ static_assert(!std::weakly_incrementable >); static_assert(std::indirectly_movable, std::shared_ptr>); static_assert(std::indirectly_movable_storable, std::shared_ptr>); +static_assert(std::indirectly_swappable, std::shared_ptr >); static_assert(!std::indirectly_readable >); static_assert(!std::indirectly_writable, void>);