diff --git a/include/exec/__detail/__sender_facade.hpp b/include/exec/__detail/__sender_facade.hpp index 537d1deda..98086f36c 100644 --- a/include/exec/__detail/__sender_facade.hpp +++ b/include/exec/__detail/__sender_facade.hpp @@ -91,13 +91,6 @@ namespace exec { __declval<__data_placeholder&>(), __declval<__receiver_placeholder<_Env>&>())); - struct __dependent_sender { - using is_sender = void; - using __t = __dependent_sender; - friend auto tag_invoke(get_completion_signatures_t, __dependent_sender, no_env) - -> dependent_completion_signatures; - }; - struct __sender_transform_failed { using __t = __sender_transform_failed; }; @@ -109,8 +102,6 @@ namespace exec { } else { if constexpr (__mvalid<__tfx_sender_, _Kernel, _Sender, _Env>) { return __mtype<__tfx_sender_<_Kernel, _Sender, _Env>>{}; - } else if constexpr (same_as<_Env, no_env>) { - return __dependent_sender{}; } else { return __sender_transform_failed{}; } @@ -120,7 +111,6 @@ namespace exec { template auto __transform_sender(_Kernel& __kernel, _Sender&& __sndr, _Data& __data, _Receiver& __rcvr) { - static_assert(!same_as, no_env>); if constexpr (__lacks_transform_sender<_Kernel>) { return (_Sender&&) __sndr; } else { @@ -141,11 +131,7 @@ namespace exec { __declval<_As>()...)); template - using __get_env_ = decltype(__declval<_Kernel&>().get_env(__declval<_Env>())); - - template - using __env_t = - __minvoke< __if_c, __mconst, __q<__get_env_>>, _Kernel, _Env>; + using __env_t = decltype(__declval<_Kernel&>().get_env(__declval<_Env>())); template auto __completions_from_sig(_Tag (*)(_As...)) @@ -312,19 +298,13 @@ namespace exec { __completions_t<_NewEnv, __pre_completions_t<_NewSender, _NewEnv>>; if constexpr (__valid_completion_signatures<_Completions, _Env>) { return (_Completions(*)()) nullptr; - } else if constexpr (same_as) { - return (dependent_completion_signatures(*)()) nullptr; } else { // assume this is an error message and return it directly return (_Completions(*)()) nullptr; } - } else if constexpr (same_as) { - return (dependent_completion_signatures(*)()) nullptr; } else { return (__diagnostic_t<_Env>(*)()) nullptr; } - } else if constexpr (same_as) { - return (dependent_completion_signatures(*)()) nullptr; } else if constexpr (same_as<_NewSender, __sender_transform_failed>) { return (__diagnostic_t<_Env>(*)()) nullptr; } else { diff --git a/include/exec/any_sender_of.hpp b/include/exec/any_sender_of.hpp index 65ff4585f..dd741fe9d 100644 --- a/include/exec/any_sender_of.hpp +++ b/include/exec/any_sender_of.hpp @@ -794,6 +794,7 @@ namespace exec { using _Receiver = stdexec::__t<_ReceiverId>; struct __t { + using is_receiver = void; __operation_base<_Receiver>* __op_; template _SetNext, same_as<__t> _Self, class _Item> diff --git a/include/exec/env.hpp b/include/exec/env.hpp index 75cba0a50..831ad8166 100644 --- a/include/exec/env.hpp +++ b/include/exec/env.hpp @@ -95,7 +95,7 @@ namespace exec { return {{}, ((_Self&&) __self).__default_, (_Receiver&&) __rcvr}; } - template <__none_of _Env> + template friend auto tag_invoke(get_completion_signatures_t, __sender, _Env&&) -> __completions_t<_Env> { return {}; diff --git a/include/exec/finally.hpp b/include/exec/finally.hpp index 45ba30608..98ac21f1c 100644 --- a/include/exec/finally.hpp +++ b/include/exec/finally.hpp @@ -263,7 +263,7 @@ namespace exec { (_Rec&&) __receiver}; } - template <__decays_to<__t> _Self, __none_of _Env> + template <__decays_to<__t> _Self, class _Env> friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env&&) noexcept -> __completion_signatures_t< __copy_cvref_t<_Self, _InitialSender>, diff --git a/include/exec/sequence/any_sequence_of.hpp b/include/exec/sequence/any_sequence_of.hpp index 708812ef2..8056aed3f 100644 --- a/include/exec/sequence/any_sequence_of.hpp +++ b/include/exec/sequence/any_sequence_of.hpp @@ -21,7 +21,7 @@ namespace exec { namespace __any { namespace __next { - template <__is_completion_signatures _Sigs> + template <__valid_completion_signatures _Sigs> struct __rcvr_next_vfun { using __return_sigs = completion_signatures; using __void_sender = typename any_receiver_ref<__return_sigs>::template any_sender<>; @@ -37,7 +37,7 @@ namespace exec { template using __item_sender = typename any_receiver_ref<_Sigs>::template any_sender<>; - template <__is_completion_signatures _Sigs> + template <__valid_completion_signatures _Sigs> constexpr __void_sender (*operator()(_Sigs*) const)(void*, __item_sender<_Sigs>&&) { return +[](void* __r, __item_sender<_Sigs>&& __sndr) noexcept -> __void_sender { return __void_sender{ @@ -295,7 +295,7 @@ namespace exec { template < std::same_as _SetNext, std::same_as<__t> _Self, - stdexec::__sender _Sender> + stdexec::sender _Sender> requires stdexec::__callable friend auto tag_invoke(_SetNext, _Self& __self, _Sender&& __sender) { return exec::set_next(__self.__receiver_, static_cast<_Sender&&>(__sender)); diff --git a/include/exec/sequence_senders.hpp b/include/exec/sequence_senders.hpp index 9fa7c03ee..b20d0fb03 100644 --- a/include/exec/sequence_senders.hpp +++ b/include/exec/sequence_senders.hpp @@ -333,15 +333,6 @@ namespace exec { __nothrow_callable && __nothrow_callable>; using _TfxSender = __tfx_sndr<_Sender, _Receiver>; - if constexpr (!enable_sender<__decay_t<_Sender>>) - __connect::_PLEASE_UPDATE_YOUR_SENDER_TYPE<__decay_t<_Sender>>(); - - if constexpr (!enable_sender<__decay_t<_TfxSender>>) - __connect::_PLEASE_UPDATE_YOUR_SENDER_TYPE<__decay_t<_TfxSender>>(); - - if constexpr (!enable_receiver<__decay_t<_Receiver>>) - __connect::_PLEASE_UPDATE_YOUR_RECEIVER_TYPE<__decay_t<_Receiver>>(); - if constexpr (__next_connectable_with_tag_invoke<_TfxSender, _Receiver>) { using _Result = tag_invoke_result_t< connect_t, diff --git a/include/exec/when_any.hpp b/include/exec/when_any.hpp index 24ffaed5b..614436214 100644 --- a/include/exec/when_any.hpp +++ b/include/exec/when_any.hpp @@ -122,7 +122,7 @@ namespace exec { try { __result_.emplace(std::tuple{_CPO{}, (_Args&&) __args...}); } catch (...) { - __result_.emplace(set_error_t{}, std::current_exception()); + __result_.emplace(std::tuple{set_error_t{}, std::current_exception()}); } } // stop pending operations diff --git a/include/nvexec/stream/when_all.cuh b/include/nvexec/stream/when_all.cuh index e129d4068..ac6fd7319 100644 --- a/include/nvexec/stream/when_all.cuh +++ b/include/nvexec/stream/when_all.cuh @@ -49,7 +49,15 @@ namespace nvexec::STDEXEC_STREAM_DETAIL_NS { template struct completions { - using __t = dependent_completion_signatures; + template + using too_many_completions = __mbool<(__v<__count_of> > 1)>; + + using InvalidArg = // + __minvoke< + __mfind_if<__mbind_back_q, __q<__mfront>>, + Senders...>; + + using __t = stdexec::__when_all::__too_many_value_completions_error; }; template @@ -63,7 +71,6 @@ namespace nvexec::STDEXEC_STREAM_DETAIL_NS { struct completions { using non_values = // __concat_completion_signatures_t< - completion_signatures< set_error_t(cudaError_t), set_stopped_t()>, __try_make_completion_signatures< Senders, diff --git a/include/stdexec/__detail/__meta.hpp b/include/stdexec/__detail/__meta.hpp index ed00a87b2..2c0e167df 100644 --- a/include/stdexec/__detail/__meta.hpp +++ b/include/stdexec/__detail/__meta.hpp @@ -389,7 +389,7 @@ namespace stdexec { struct _BAD_SUBSTITUTION_ { }; template - struct _WITH_TYPES_ { }; + struct _WITH_TYPES_; template