Skip to content

Commit 5724156

Browse files
committed
avoid type-deduction in continues_on
1 parent 624efd6 commit 5724156

File tree

2 files changed

+25
-6
lines changed

2 files changed

+25
-6
lines changed

include/stdexec/__detail/__continues_on.hpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ namespace STDEXEC {
4949
// ...
5050
// >
5151
template <class _CvSender, class _Env>
52-
using __results_of = __for_each_completion_signature_t<
52+
using __results_of_t = __for_each_completion_signature_t<
5353
__completion_signatures_of_t<_CvSender, _Env>,
5454
__decayed_tuple,
5555
__munique<__qq<STDEXEC::__variant>>::__f
@@ -95,7 +95,7 @@ namespace STDEXEC {
9595

9696
template <class _Sexpr, class _Receiver>
9797
struct __state_base : __immovable {
98-
using __variant_t = __results_of<__child_of<_Sexpr>, env_of_t<_Receiver>>;
98+
using __variant_t = __results_of_t<__child_of<_Sexpr>, env_of_t<_Receiver>>;
9999

100100
_Receiver __rcvr_;
101101
__variant_t __data_{__no_init};
@@ -133,7 +133,7 @@ namespace STDEXEC {
133133

134134
template <class _Scheduler, class _Sexpr, class _Receiver>
135135
struct __state : __state_base<_Sexpr, _Receiver> {
136-
using __variant_t = __results_of<__child_of<_Sexpr>, env_of_t<_Receiver>>;
136+
using __variant_t = __results_of_t<__child_of<_Sexpr>, env_of_t<_Receiver>>;
137137
using __receiver2_t = __receiver2<_Sexpr, _Receiver>;
138138

139139
constexpr explicit __state(_Scheduler __sched, _Receiver&& __rcvr)
@@ -342,6 +342,8 @@ namespace STDEXEC {
342342
}
343343
}
344344

345+
template <class _Sender, class _Receiver>
346+
using __state_for_t = __state<__decay_t<__tuple_element_t<1, _Sender>>, _Sender, _Receiver>;
345347

346348
public:
347349
static constexpr auto get_attrs =
@@ -365,12 +367,12 @@ namespace STDEXEC {
365367

366368
static constexpr auto get_state =
367369
[]<class _Sender, class _Receiver>(_Sender&& __sndr, _Receiver&& __rcvr)
370+
-> __state_for_t<_Sender, _Receiver>
368371
requires sender_in<__child_of<_Sender>, __fwd_env_t<env_of_t<_Receiver>>>
369372
{
370373
static_assert(sender_expr_for<_Sender, continues_on_t>);
371-
auto __sched = STDEXEC::__get<1>(static_cast<_Sender&&>(__sndr));
372-
return __state<decltype(__sched), _Sender, _Receiver>{
373-
__sched, static_cast<_Receiver&&>(__rcvr)};
374+
auto& [__tag, __sched, __child] = __sndr;
375+
return __state_for_t<_Sender, _Receiver>{__sched, static_cast<_Receiver&&>(__rcvr)};
374376
};
375377

376378
static constexpr auto complete = []<class _State, class _Tag, class... _Args>(

test/exec/test_fork.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121

2222
#include <catch2/catch.hpp>
2323

24+
#include <atomic>
25+
2426
using namespace STDEXEC;
2527

2628
namespace {
@@ -147,4 +149,19 @@ namespace {
147149
std::get<0>(STDEXEC::sync_wait(std::move(sndr)).value())
148150
== "congrats on customizing fork_join_t");
149151
}
152+
153+
TEST_CASE("fork_join following a continues_on", "[adaptors][fork_join]") {
154+
std::atomic<int> witness = 0;
155+
156+
auto make_then = [&witness]() {
157+
return ::STDEXEC::then([&witness]() noexcept { ++witness; });
158+
};
159+
160+
auto sndr = ::STDEXEC::just() | ::STDEXEC::continues_on(::STDEXEC::inline_scheduler{})
161+
| exec::fork_join(make_then(), make_then());
162+
163+
::STDEXEC::sync_wait(std::move(sndr));
164+
165+
CHECK(witness == 2);
166+
}
150167
} // namespace

0 commit comments

Comments
 (0)