Skip to content

Commit 0f3e8d2

Browse files
authored
Merge pull request #1794 from RobertLeahy/constexpr_20260126
stdexec::let_value et al. get_state: Do Not Deduce Return Type
2 parents 5b0f1b1 + 2374cc7 commit 0f3e8d2

File tree

1 file changed

+19
-13
lines changed

1 file changed

+19
-13
lines changed

include/stdexec/__detail/__let.hpp

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

Comments
 (0)