Skip to content

Commit cacf4cf

Browse files
authored
Merge pull request #482 from bustercopley/main
when_all() should return just()
2 parents beec606 + 88e90a4 commit cacf4cf

File tree

3 files changed

+29
-8
lines changed

3 files changed

+29
-8
lines changed

include/stdexec/execution.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4763,6 +4763,9 @@ namespace stdexec {
47634763
apply([](auto&&... __child_ops) noexcept -> void {
47644764
(execution::start(__child_ops), ...);
47654765
}, __self.__child_states_);
4766+
if constexpr (sizeof...(_SenderIds) == 0) {
4767+
__self.__complete();
4768+
}
47664769
}
47674770
}
47684771

@@ -4812,17 +4815,15 @@ namespace stdexec {
48124815
struct when_all_t {
48134816
template <sender... _Senders>
48144817
requires tag_invocable<when_all_t, _Senders...> &&
4815-
sender<tag_invoke_result_t<when_all_t, _Senders...>> &&
4816-
(sizeof...(_Senders) > 0)
4818+
sender<tag_invoke_result_t<when_all_t, _Senders...>>
48174819
auto operator()(_Senders&&... __sndrs) const
48184820
noexcept(nothrow_tag_invocable<when_all_t, _Senders...>)
48194821
-> tag_invoke_result_t<when_all_t, _Senders...> {
48204822
return tag_invoke(*this, (_Senders&&) __sndrs...);
48214823
}
48224824

48234825
template <sender... _Senders>
4824-
requires (!tag_invocable<when_all_t, _Senders...>) &&
4825-
(sizeof...(_Senders) > 0)
4826+
requires (!tag_invocable<when_all_t, _Senders...>)
48264827
auto operator()(_Senders&&... __sndrs) const
48274828
-> __impl::__sender<__x<decay_t<_Senders>>...> {
48284829
return __impl::__sender<__x<decay_t<_Senders>>...>{

test/stdexec/algos/adaptors/test_transfer_when_all.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ TEST_CASE("transfer_when_all simple example", "[adaptors][transfer_when_all]") {
4444
auto op = ex::connect(std::move(snd1), expect_value_receiver<double>{3.1415});
4545
ex::start(op);
4646
}
47+
TEST_CASE("transfer_when_all with no senders", "[adaptors][transfer_when_all]") {
48+
auto snd = ex::transfer_when_all(inline_scheduler{});
49+
auto op = ex::connect(std::move(snd), expect_void_receiver{});
50+
ex::start(op);
51+
}
4752

4853
TEST_CASE("transfer_when_all transfers the result when the scheduler dictates",
4954
"[adaptors][transfer_when_all]") {
@@ -57,6 +62,17 @@ TEST_CASE("transfer_when_all transfers the result when the scheduler dictates",
5762
sched.start_next();
5863
CHECK(res == 3.1415);
5964
}
65+
TEST_CASE("transfer_when_all with no senders transfers the result", "[adaptors][transfer_when_all]") {
66+
impulse_scheduler sched;
67+
auto snd = ex::transfer_when_all(sched);
68+
auto snd1 = std::move(snd) | ex::then([]() { return true; });
69+
bool res{false};
70+
auto op = ex::connect(std::move(snd1), expect_value_receiver_ex<bool>{&res});
71+
ex::start(op);
72+
CHECK(!res);
73+
sched.start_next();
74+
CHECK(res);
75+
}
6076

6177
TEST_CASE("transfer_when_all_with_variant returns a sender", "[adaptors][transfer_when_all]") {
6278
auto snd = ex::transfer_when_all_with_variant(inline_scheduler{}, ex::just(3), ex::just(0.1415));

test/stdexec/algos/adaptors/test_when_all.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,9 @@ TEST_CASE("when_all with just one sender", "[adaptors][when_all]") {
6868
wait_for_value(std::move(snd), 2);
6969
}
7070

71-
TEST_CASE("when_all with no senders sender -- should fail", "[adaptors][when_all]") {
72-
// Should not compile:
73-
// auto snd = ex::when_all();
74-
static_assert(!std::invocable<ex::when_all_t>);
71+
TEST_CASE("when_all with no senders", "[adaptors][when_all]") {
72+
ex::sender auto snd = ex::when_all();
73+
wait_for_value(std::move(snd));
7574
}
7675

7776
TEST_CASE("when_all when one sender sends void", "[adaptors][when_all]") {
@@ -100,6 +99,11 @@ TEST_CASE("when_all_with_variant with same type", "[adaptors][when_all]") {
10099
std::move(snd), std::variant<std::tuple<int>>{2}, std::variant<std::tuple<int>>{3});
101100
}
102101

102+
TEST_CASE("when_all_with_variant with no senders", "[adaptors][when_all]") {
103+
ex::sender auto snd = ex::when_all_with_variant();
104+
wait_for_value(std::move(snd));
105+
}
106+
103107
TEST_CASE("when_all completes when children complete", "[adaptors][when_all]") {
104108
impulse_scheduler sched;
105109
bool called{false};

0 commit comments

Comments
 (0)