Skip to content
Merged
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
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