Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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
3 changes: 2 additions & 1 deletion include/exec/libdispatch_queue.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -537,7 +537,8 @@ namespace experimental::execution

bulk_op_state(libdispatch_queue &queue, Shape shape, Fun fun, CvSender &&sndr, Receiver rcvr)
: shared_state_(std::move(rcvr), shape, fun)
, inner_op_{STDEXEC::connect(std::move(sndr), bulk_rcvr{shared_state_, queue})}
, inner_op_{
STDEXEC::connect(static_cast<CvSender &&>(sndr), bulk_rcvr{shared_state_, queue})}
{}

void start() & noexcept
Expand Down
49 changes: 49 additions & 0 deletions test/exec/test_libdispatch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,42 @@

namespace
{
struct lvalue_connect_sender
{
using sender_concept = STDEXEC::sender_tag;

template <class, class...>
static consteval auto
get_completion_signatures() -> STDEXEC::completion_signatures<STDEXEC::set_value_t(int)>
{
return {};
}

auto get_env() const noexcept -> STDEXEC::env<>
{
return {};
}

template <STDEXEC::receiver Receiver>
struct operation
{
using operation_state_concept = STDEXEC::operation_state_tag;

Receiver receiver_;

void start() & noexcept
{
STDEXEC::set_value(std::move(receiver_), 42);
}
};

template <STDEXEC::receiver Receiver>
auto connect(Receiver receiver) & noexcept -> operation<Receiver>
{
return {std::move(receiver)};
}
};

TEST_CASE("libdispatch queue should be able to process tasks")
{
exec::libdispatch_queue queue;
Expand Down Expand Up @@ -201,4 +237,17 @@ namespace
CHECK(seen == 42);
CHECK_FALSE(value.moved_from);
}

TEST_CASE("libdispatch bulk connects an lvalue child sender as an lvalue")
{
exec::libdispatch_queue queue;
auto fun = [](int, int &) noexcept {};
using sender_t = exec::__libdispatch::bulk_sender<lvalue_connect_sender, int, decltype(fun)>;

sender_t sender{queue, lvalue_connect_sender{}, 0, std::move(fun)};
auto result = STDEXEC::sync_wait(sender);

REQUIRE(result.has_value());
CHECK(std::get<0>(*result) == 42);
}
} // namespace
Loading