@@ -113,7 +113,9 @@ namespace STDEXEC {
113113 }
114114
115115 [[nodiscard]]
116- constexpr auto get_env () const noexcept {
116+ constexpr decltype (__env::__join(
117+ __declval<const _Env2&>(),
118+ __declval<STDEXEC::env_of_t<_Receiver&>>())) get_env() const noexcept {
117119 return __env::__join (__env_, STDEXEC::get_env (__rcvr_));
118120 }
119121
@@ -648,7 +650,20 @@ namespace STDEXEC {
648650 };
649651
650652 template <class _SetTag >
651- struct __let_impl : __sexpr_defaults {
653+ class __let_impl : public __sexpr_defaults {
654+ template <typename _Sender, typename _Receiver>
655+ using __state_t = __gather_completions_of_t <
656+ _SetTag,
657+ __child_of_t <_Sender>,
658+ __fwd_env_t <env_of_t <_Receiver>>,
659+ __q<__decayed_tuple>,
660+ __mbind_front_q<
661+ __state,
662+ _SetTag,
663+ __child_of_t <_Sender>,
664+ __decay_t <__fn_of_t <_Sender>>,
665+ _Receiver>>;
666+ public:
652667 static constexpr auto get_attrs =
653668 []<class _Child , class _Fun >(
654669 const __data<_Child, _Fun>& __data) noexcept -> decltype (auto ) {
@@ -679,23 +694,14 @@ namespace STDEXEC {
679694
680695 static constexpr auto get_state =
681696 []<class _Receiver , __decay_copyable _Sender>(_Sender&& __sndr, _Receiver&& __rcvr)
697+ -> __state_t <_Sender, _Receiver>
682698 requires sender_in<__child_of_t <_Sender>, __fwd_env_t <env_of_t <_Receiver>>>
683699 // TODO(ericniebler): make this conditionally noexcept
684700 {
685701 static_assert (sender_expr_for<_Sender, __let_tag<_SetTag>>);
686- using __child_t = __child_of_t <_Sender>;
687- using __fn_t = __decay_t <__fn_of_t <_Sender>>;
688- using __mk_state = __mbind_front_q<__state, _SetTag, __child_t , __fn_t , _Receiver>;
689- using __state_t = __gather_completions_of_t <
690- _SetTag,
691- __child_t ,
692- __fwd_env_t <env_of_t <_Receiver>>,
693- __q<__decayed_tuple>,
694- __mk_state
695- >;
696702 auto & [__tag, __data] = __sndr;
697703 auto & [__child, __fn] = __data;
698- return __state_t (
704+ return __state_t <_Sender, _Receiver> (
699705 STDEXEC::__forward_like<_Sender>(__child),
700706 STDEXEC::__forward_like<_Sender>(__fn),
701707 static_cast <_Receiver&&>(__rcvr));
0 commit comments