@@ -123,13 +123,37 @@ namespace STDEXEC
123123
124124 struct spawn_t
125125 {
126+ private:
127+ template <class _Sender , class _Token >
128+ using _wrapped_sender_t = decltype (__declval<_Token&>().wrap(__declval<_Sender>()));
129+
130+ template <class _Sender , class _Env >
131+ using __choose_senv_t = __result_of<__spawn_common::__choose_senv, _Env, env_of_t <_Sender>>;
132+
133+ template <class _Sender , class _Env >
134+ using _spawn_sndr_impl_t = __result_of<write_env, _Sender, __choose_senv_t <_Sender, _Env>>;
135+
136+ template <class _Sender , class _Token , class _Env >
137+ using _spawn_sndr_t = _spawn_sndr_impl_t <_wrapped_sender_t <_Sender, _Token>, _Env>;
138+
139+ public:
126140 template <sender _Sender, scope_token _Token>
127141 void operator ()(_Sender&& __sndr, _Token __tkn) const
128142 {
129143 return (*this )(static_cast <_Sender&&>(__sndr), static_cast <_Token&&>(__tkn), env<>{});
130144 }
131145
132146 template <sender _Sender, scope_token _Token, class _Env >
147+ void operator ()(_Sender&&, _Token, _Env&&) const
148+ {
149+ using _spawn_sndr_t = spawn_t ::_spawn_sndr_t <_Sender, _Token, _Env>;
150+ static_assert (sender_in<_spawn_sndr_t , _Env>
151+ && __never_sends<STDEXEC::set_error_t , _spawn_sndr_t , _Env>,
152+ " spawn expects a sender that cannot fail" );
153+ }
154+
155+ template <sender _Sender, scope_token _Token, class _Env >
156+ requires __never_sends<STDEXEC::set_error_t , _spawn_sndr_t <_Sender, _Token, _Env>, _Env>
133157 void operator ()(_Sender&& __sndr, _Token __tkn, _Env&& __env) const
134158 {
135159 auto __wrapped_sender = __tkn.wrap (static_cast <_Sender&&>(__sndr));
@@ -141,8 +165,7 @@ namespace STDEXEC
141165 auto __sender_with_env = write_env (std::move (__wrapped_sender),
142166 __spawn_common::__choose_senv (__env, __sndr_env));
143167
144- using __spawn_state_t =
145- __spawn_state<__raw_alloc_t , std::remove_cvref_t <_Token>, decltype (__sender_with_env)>;
168+ using __spawn_state_t = __spawn_state<__raw_alloc_t , _Token, decltype (__sender_with_env)>;
146169
147170 using __traits =
148171 std::allocator_traits<__raw_alloc_t >::template rebind_traits<__spawn_state_t >;
0 commit comments