Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion include/exec/sequence/iterate.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,12 @@ namespace experimental::execution
struct __subscribe_fn
{
template <class _Range>
constexpr auto operator()(__ignore, _Range&& __range) noexcept
constexpr auto operator()(__ignore, _Range&& __range) noexcept(
noexcept(std::ranges::begin(static_cast<_Range&&>(__range)))
&& noexcept(std::ranges::end(static_cast<_Range&&>(__range)))
&& __nothrow_move_constructible<std::ranges::iterator_t<_Range>,
std::ranges::sentinel_t<_Range>,
_Receiver>)
{
return __operation{std::ranges::begin(static_cast<_Range&&>(__range)),
std::ranges::end(static_cast<_Range&&>(__range)),
Expand Down
29 changes: 29 additions & 0 deletions test/exec/sequence/test_iterate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,26 @@
namespace
{

struct begin_error
{};

struct begin_throws_range
{
using iterator = std::array<int, 1>::iterator;

iterator begin()
{
throw begin_error{};
}

iterator end() noexcept
{
return values.end();
}

std::array<int, 1> values{0};
};

template <class Receiver>
struct sum_item_rcvr
{
Expand Down Expand Up @@ -140,4 +160,13 @@ namespace
CHECK(sum == (42 + 43 + 44 + 1));
}

TEST_CASE("iterate - subscribe propagates begin exceptions", "[sequence_senders][iterate]")
{
auto iterate = exec::iterate(begin_throws_range{});
int sum = 0;

STATIC_REQUIRE_FALSE(noexcept(exec::subscribe(iterate, sum_receiver<>{.sum_ = sum})));
CHECK_THROWS_AS(exec::subscribe(iterate, sum_receiver<>{.sum_ = sum}), begin_error);
}

} // namespace
Loading