@@ -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