diff options
author | Stephan T. Lavavej <stl@nuwen.net> | 2023-12-06 02:29:09 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-06 02:29:09 -0800 |
commit | bfdc562d0c6ff18ae3a8d618a2cb05c22a04898b (patch) | |
tree | 49c9a6c6af800d76f4bfd8decd5117d82a73a3f2 /libcxx/test/std | |
parent | fcd06d774dad1b5bcdc22f5f10a9d5c62c585814 (diff) | |
download | llvm-bfdc562d0c6ff18ae3a8d618a2cb05c22a04898b.zip llvm-bfdc562d0c6ff18ae3a8d618a2cb05c22a04898b.tar.gz llvm-bfdc562d0c6ff18ae3a8d618a2cb05c22a04898b.tar.bz2 |
[libc++] Fix copy-paste damage in `ranges::rotate_copy` and its test (#74544)
Found while running libc++'s tests with MSVC's STL.
`ranges::rotate_copy` takes `forward_iterator`s as this test's comment
banner correctly depicts. However, this test had bogus assertions
expecting that `ranges::rotate_copy` would be constrained away for
not-quite-**bidi** iterators. @philnik777 confirmed that these were
copy-paste relics from the `ranges::reverse_copy` test.
I fixed this by replacing the assertions with the test types that aren't
quite **forward** iterators/ranges. Additionally, I noticed that the
top-level `test()` function was missing coverage with the weakest
possible `forward_iterator<int*>`.
This revealed that the product code in `ranges_rotate_copy.h` was
similarly damaged. In addition to fixing it by taking `forward_iterator`
and `forward_range` as depicted in the Standard, this drops the
inclusion of `<__iterator/reverse_iterator.h>` as this algorithm doesn't
need `std::__reverse_range`.
Diffstat (limited to 'libcxx/test/std')
-rw-r--r-- | libcxx/test/std/algorithms/alg.modifying.operations/alg.rotate/ranges.rotate_copy.pass.cpp | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/libcxx/test/std/algorithms/alg.modifying.operations/alg.rotate/ranges.rotate_copy.pass.cpp b/libcxx/test/std/algorithms/alg.modifying.operations/alg.rotate/ranges.rotate_copy.pass.cpp index 1f18d78..58b0f75 100644 --- a/libcxx/test/std/algorithms/alg.modifying.operations/alg.rotate/ranges.rotate_copy.pass.cpp +++ b/libcxx/test/std/algorithms/alg.modifying.operations/alg.rotate/ranges.rotate_copy.pass.cpp @@ -34,16 +34,16 @@ template <class Range, class Out = int*> concept HasRotateCopyR = requires(Range range, Out out) { std::ranges::rotate_copy(range, nullptr, out); }; static_assert(HasRotateCopyIt<int*>); -static_assert(!HasRotateCopyIt<BidirectionalIteratorNotDerivedFrom>); -static_assert(!HasRotateCopyIt<BidirectionalIteratorNotDecrementable>); +static_assert(!HasRotateCopyIt<ForwardIteratorNotDerivedFrom>); +static_assert(!HasRotateCopyIt<ForwardIteratorNotIncrementable>); static_assert(!HasRotateCopyIt<int*, SentinelForNotSemiregular>); static_assert(!HasRotateCopyIt<int*, SentinelForNotWeaklyEqualityComparableWith>); static_assert(!HasRotateCopyIt<int*, OutputIteratorNotIndirectlyWritable>); static_assert(!HasRotateCopyIt<int*, OutputIteratorNotInputOrOutputIterator>); static_assert(HasRotateCopyR<UncheckedRange<int*>>); -static_assert(!HasRotateCopyR<BidirectionalRangeNotDerivedFrom>); -static_assert(!HasRotateCopyR<BidirectionalRangeNotDecrementable>); +static_assert(!HasRotateCopyR<ForwardRangeNotDerivedFrom>); +static_assert(!HasRotateCopyR<ForwardRangeNotIncrementable>); static_assert(!HasRotateCopyR<UncheckedRange<int*, SentinelForNotSemiregular>>); static_assert(!HasRotateCopyR<UncheckedRange<int*>, OutputIteratorNotIndirectlyWritable>); static_assert(!HasRotateCopyR<UncheckedRange<int*>, OutputIteratorNotInputOrOutputIterator>); @@ -112,6 +112,7 @@ constexpr void test_out_iterators() { } constexpr bool test() { + test_out_iterators<forward_iterator<int*>>(); test_out_iterators<bidirectional_iterator<int*>>(); test_out_iterators<random_access_iterator<int*>>(); test_out_iterators<contiguous_iterator<int*>>(); |