Skip to content

Commit 6c577a6

Browse files
committed
Fix __stop_when completion signatures
1 parent f91f636 commit 6c577a6

2 files changed

Lines changed: 29 additions & 8 deletions

File tree

include/stdexec/__detail/__spawn_future.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ namespace STDEXEC
230230

231231
using __op_t = connect_result_t<__future_spawned_sender<_Sender, _Env>, __receiver_t>;
232232

233-
using __base = __spawn_future_state_base<completion_signatures_of_t<_Sender, _Env>>;
233+
using __base = typename __spawn_future_state::__spawn_future_state_base;
234234

235235
__spawn_future_state(_Alloc __alloc, _Sender&& __sndr, _Token __token, _Env __env)
236236
: __base(__do_try_cancel, __do_complete)

include/stdexec/__detail/__stop_when.hpp

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,6 @@ namespace STDEXEC
7979

8080
struct __stop_when_impl : __sexpr_defaults
8181
{
82-
template <class _Sender, class... _Env>
83-
static consteval auto __get_completion_signatures()
84-
{
85-
static_assert(__sender_for<_Sender, __stop_when_t>);
86-
return get_completion_signatures<__child_of<_Sender>, _Env...>();
87-
};
88-
8982
static constexpr auto __get_env = [](__ignore, auto const & __state) noexcept
9083
{
9184
return __env::__join(prop(get_stop_token, __state.__token_),
@@ -199,6 +192,34 @@ namespace STDEXEC
199192
get_stop_token(STDEXEC::get_env(__rcvr)));
200193
return __state{std::move(__new_token), std::move(__rcvr)};
201194
};
195+
196+
template <class _Sender, class... _Env>
197+
static consteval auto __get_completion_signatures()
198+
{
199+
static_assert(__sender_for<_Sender, __stop_when_t>);
200+
201+
auto __sender_token = [](_Sender&& s)
202+
{
203+
auto& [__tag, __token, __child] = s;
204+
return __token;
205+
};
206+
207+
auto __new_token = [&](_Sender&& s, auto&& e)
208+
{
209+
return __make_token_fn{}(__sender_token(std::forward<_Sender>(s)), get_stop_token(e));
210+
};
211+
212+
auto __child_env = [&]<class Env>(_Sender&& s, Env&& e)
213+
{
214+
return __env::__join(prop(get_stop_token,
215+
__new_token(std::forward<_Sender>(s), std::forward<Env>(e))),
216+
std::forward<Env>(e));
217+
};
218+
219+
return get_completion_signatures<__child_of<_Sender>,
220+
decltype(__child_env(std::declval<_Sender>(),
221+
std::declval<_Env>()))...>();
222+
};
202223
};
203224
} // namespace __stop_when_
204225

0 commit comments

Comments
 (0)