@@ -123,22 +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 >
133- requires __sends<STDEXEC::set_error_t , _Sender, _Env>
134- void operator ()(_Sender&& __sndr, _Token __tkn, _Env&& __env) const
147+ void operator ()(_Sender&&, _Token, _Env&&) const
135148 {
136- static_assert (__never_sends<STDEXEC::set_error_t , _Sender, _Env>,
137- " spawn does not support senders that can complete with an error" );
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" );
138153 }
139154
140155 template <sender _Sender, scope_token _Token, class _Env >
141- requires __never_sends<STDEXEC::set_error_t , _Sender, _Env>
156+ requires __never_sends<STDEXEC::set_error_t , _spawn_sndr_t < _Sender, _Token, _Env> , _Env>
142157 void operator ()(_Sender&& __sndr, _Token __tkn, _Env&& __env) const
143158 {
144159 auto __wrapped_sender = __tkn.wrap (static_cast <_Sender&&>(__sndr));
@@ -150,8 +165,7 @@ namespace STDEXEC
150165 auto __sender_with_env = write_env (std::move (__wrapped_sender),
151166 __spawn_common::__choose_senv (__env, __sndr_env));
152167
153- using __spawn_state_t =
154- __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)>;
155169
156170 using __traits =
157171 std::allocator_traits<__raw_alloc_t >::template rebind_traits<__spawn_state_t >;
0 commit comments