[libcxx-commits] [libcxx] [libc++][ranges][enumerate_view] Fix iterator `iter_move` test (PR #219474)
via libcxx-commits
libcxx-commits at lists.llvm.org
Fri Aug 28 06:39:37 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-libcxx
Author: Lucas Mellone (lknknm)
<details>
<summary>Changes</summary>
Completes the [range.enumerate.iterator] `iter_move` test by addressing the review comment https://github.com/llvm/llvm-project/pull/73617/changes#r1416642892 from the original implementation.
---
Full diff: https://github.com/llvm/llvm-project/pull/219474.diff
1 Files Affected:
- (modified) libcxx/test/std/ranges/range.adaptors/range.enumerate/iterator/iter_move.pass.cpp (+47-13)
``````````diff
diff --git a/libcxx/test/std/ranges/range.adaptors/range.enumerate/iterator/iter_move.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.enumerate/iterator/iter_move.pass.cpp
index ed28662a8a5eb..2a9b462717711 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.enumerate/iterator/iter_move.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.enumerate/iterator/iter_move.pass.cpp
@@ -28,6 +28,12 @@
#include "test_iterators.h"
#include "../types.h"
+#include "../../range_adaptor_types.h"
+
+struct ThrowingMove {
+ ThrowingMove() = default;
+ ThrowingMove(ThrowingMove&&) {}
+};
template <class Iterator, bool HasNoexceptIterMove>
constexpr void test() {
@@ -38,19 +44,47 @@ constexpr void test() {
std::array array{0, 1, 2, 3, 4};
- View mv{Iterator(std::to_address(base(array.begin()))), Sentinel(Iterator(std::to_address(base(array.end()))))};
- EnumerateView ev{std::move(mv)};
- EnumerateIterator const it = ev.begin();
-
- auto&& result = iter_move(it);
-
- using DifferenceT = std::iter_difference_t<EnumerateIterator>;
- static_assert(std::is_same_v<decltype(result), std::tuple<DifferenceT, int&&>&&>);
-
- assert(get<0>(result) == 0);
- assert(&get<1>(result) == std::to_address(base(array.begin())));
-
- static_assert(noexcept(iter_move(it)) == HasNoexceptIterMove);
+ {
+ // underlying iter_move noexcept
+ View mv{Iterator(std::to_address(base(array.begin()))), Sentinel(Iterator(std::to_address(base(array.end()))))};
+ EnumerateView ev{std::move(mv)};
+ EnumerateIterator const it = ev.begin();
+
+ auto&& result = iter_move(it);
+
+ using DifferenceT = std::iter_difference_t<EnumerateIterator>;
+ static_assert(std::is_same_v<decltype(result), std::tuple<DifferenceT, int&&>&&>);
+
+ assert(get<0>(result) == 0);
+ assert(&get<1>(result) == std::to_address(base(array.begin())));
+
+ static_assert(noexcept(iter_move(it)) == HasNoexceptIterMove);
+ }
+
+ {
+ // !is_nothrow_move_constructible_v<range_rvalue_reference_t<Base>>
+ // underlying iter_move may throw
+ auto throwingMoveRange = std::views::iota(0, 9) | std::views::transform([](auto) noexcept { return ThrowingMove{}; });
+ std::ranges::enumerate_view v(throwingMoveRange);
+ auto it = v.begin();
+ static_assert(!noexcept(std::ranges::iter_move(it)));
+ }
+
+ {
+ // underlying iterator iter_move is called through ranges::iter_move
+ adltest::IterMoveSwapRange r1{};
+ assert(r1.iter_move_called_times == 0);
+ std::ranges::enumerate_view v(r1);
+ auto it = v.begin();
+ {
+ [[maybe_unused]] auto&& i = std::ranges::iter_move(it);
+ assert(r1.iter_move_called_times == 1);
+ }
+ {
+ [[maybe_unused]] auto&& i = std::ranges::iter_move(it);
+ assert(r1.iter_move_called_times == 2);
+ }
+ }
}
constexpr bool tests() {
``````````
</details>
https://github.com/llvm/llvm-project/pull/219474
More information about the libcxx-commits
mailing list