Skip to content

Commit add8d34

Browse files
authored
fix diagnostic for passing a fallible sender to spawn (#2000)
* fix diagnostic for passing a fallible sender to `spawn` fixes #1991
1 parent bd0d43f commit add8d34

1 file changed

Lines changed: 25 additions & 2 deletions

File tree

include/stdexec/__detail/__spawn.hpp

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

Comments
 (0)