Skip to content

Commit 9656530

Browse files
committed
don't be sloppy with type checking
1 parent f335293 commit 9656530

File tree

1 file changed

+21
-7
lines changed

1 file changed

+21
-7
lines changed

include/stdexec/__detail/__spawn.hpp

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)