@@ -134,8 +134,9 @@ namespace exec {
134134 }
135135
136136 template <receiver _Receiver, sender _Item>
137- requires (!__has_set_next_member<_Receiver, _Item>)
138- && tag_invocable<set_next_t , _Receiver&, _Item>
137+ requires __has_set_next_member<_Receiver, _Item>
138+ || tag_invocable<set_next_t , _Receiver&, _Item>
139+ [[deprecated(" the use of tag_invoke for set_next is deprecated" )]]
139140 auto operator ()(_Receiver& __rcvr, _Item&& __item) const
140141 noexcept (nothrow_tag_invocable<set_next_t , _Receiver&, _Item>)
141142 -> tag_invoke_result_t<set_next_t, _Receiver&, _Item> {
@@ -298,8 +299,8 @@ namespace exec {
298299 } else if constexpr (__is_debug_env<_Env>) {
299300 using __tag_invoke::tag_invoke;
300301 // This ought to cause a hard error that indicates where the problem is.
301- using __item_types_t [[maybe_unused]] =
302- decltype (__declval< __tfx_sequence_t >() .get_item_types (__declval<_Env>()));
302+ using __item_types_t [[maybe_unused]] = decltype (__declval< __tfx_sequence_t >()
303+ .get_item_types (__declval<_Env>()));
303304 return static_cast <__debug::__item_types (*)()>(nullptr );
304305 } else {
305306 using __result_t = __unrecognized_sequence_error_t <_Sequence, _Env>;
@@ -560,6 +561,7 @@ namespace exec {
560561 concept __subscribable_with_tag_invoke = tag_invocable<subscribe_t , _Sequence, _Receiver>;
561562
562563 struct subscribe_t {
564+ private:
563565 template <class _Sequence , class _Receiver >
564566 STDEXEC_ATTRIBUTE (always_inline)
565567 static constexpr auto __type_check_arguments () -> bool {
@@ -588,10 +590,8 @@ namespace exec {
588590
589591 template <class _Sequence , class _Receiver >
590592 static constexpr auto __get_declfn () noexcept {
591- using __domain_t =
592- stdexec::__detail::__completing_domain_t <set_value_t , _Sequence, env_of_t <_Receiver&>>;
593593 constexpr bool __nothrow_tfx_sequence =
594- __nothrow_callable<transform_sender_t , __domain_t , _Sequence, env_of_t <_Receiver>>;
594+ __nothrow_callable<transform_sender_t , _Sequence, env_of_t <_Receiver>>;
595595 using __tfx_sequence_t = __transform_sender_result_t <_Sequence, _Receiver>;
596596
597597 static_assert (
@@ -631,13 +631,6 @@ namespace exec {
631631 && noexcept (__declval<__tfx_sequence_t >()
632632 .subscribe (__declval<_Receiver>()));
633633 return __declfn<__result_t , __is_nothrow>();
634- } else if constexpr (__subscribable_with_tag_invoke<__tfx_sequence_t , _Receiver>) {
635- using __result_t = tag_invoke_result_t <subscribe_t , __tfx_sequence_t , _Receiver>;
636- __check_operation_state<__result_t >();
637- constexpr bool __is_nothrow =
638- __nothrow_tfx_sequence
639- && nothrow_tag_invocable<subscribe_t , __tfx_sequence_t , _Receiver>;
640- return __declfn<__result_t , __is_nothrow>();
641634 } else if constexpr (__is_debug_env<env_of_t <_Receiver>>) {
642635 using __result_t = __debug::__debug_operation;
643636 return __declfn<__result_t , __nothrow_tfx_sequence>();
@@ -649,9 +642,13 @@ namespace exec {
649642 }
650643 }
651644
652- template <sender _Sequence,
653- receiver _Receiver,
654- auto _DeclFn = __get_declfn<_Sequence, _Receiver>()>
645+ public:
646+ template <
647+ sender _Sequence,
648+ receiver _Receiver,
649+ auto _DeclFn = __get_declfn<_Sequence, _Receiver>()
650+ >
651+ requires stdexec::__callable<decltype (_DeclFn)>
655652 auto operator ()(_Sequence&& __sequence, _Receiver&& __rcvr) const
656653 noexcept (noexcept (_DeclFn())) -> decltype(_DeclFn()) {
657654 using __tfx_sequence_t = __transform_sender_result_t <_Sequence, _Receiver>;
@@ -661,9 +658,8 @@ namespace exec {
661658
662659 if constexpr (__next_connectable<__tfx_sequence_t , _Receiver>) {
663660 // sender as sequence of one
664- next_sender_of_t <_Receiver, __tfx_sequence_t > __next = set_next (
665- __rcvr,
666- static_cast <__tfx_sequence_t &&>(__tfx_sequence));
661+ next_sender_of_t <_Receiver, __tfx_sequence_t > __next =
662+ set_next (__rcvr, static_cast <__tfx_sequence_t &&>(__tfx_sequence));
667663 return stdexec::connect (
668664 static_cast <next_sender_of_t <_Receiver, __tfx_sequence_t >&&>(__next),
669665 __stopped_means_break_t <_Receiver>{static_cast <_Receiver&&>(__rcvr)});
@@ -674,11 +670,6 @@ namespace exec {
674670 } else if constexpr (__subscribable_with_member<__tfx_sequence_t , _Receiver>) {
675671 return static_cast <__tfx_sequence_t &&>(__tfx_sequence)
676672 .subscribe (static_cast <_Receiver&&>(__rcvr));
677- } else if constexpr (__subscribable_with_tag_invoke<__tfx_sequence_t , _Receiver>) {
678- return stdexec::tag_invoke (
679- subscribe_t {},
680- static_cast <__tfx_sequence_t &&>(__tfx_sequence),
681- static_cast <_Receiver&&>(__rcvr));
682673 } else if constexpr (enable_sequence_sender<stdexec::__decay_t <__tfx_sequence_t >>) {
683674 // sequence sender fallback
684675
@@ -691,15 +682,50 @@ namespace exec {
691682
692683 // This should generate an instantiate backtrace that contains useful
693684 // debugging information.
694- next_sender_of_t <_Receiver, __tfx_sequence_t > __next = set_next (
695- __rcvr,
696- static_cast <__tfx_sequence_t &&>(__tfx_sequence));
685+ next_sender_of_t <_Receiver, __tfx_sequence_t > __next =
686+ set_next (__rcvr, static_cast <__tfx_sequence_t &&>(__tfx_sequence));
697687 return stdexec::connect (
698688 static_cast <next_sender_of_t <_Receiver, __tfx_sequence_t >&&>(__next),
699689 __stopped_means_break_t <_Receiver>{static_cast <_Receiver&&>(__rcvr)});
700690 }
701691 }
702692
693+ template <
694+ sender _Sequence,
695+ receiver _Receiver,
696+ auto _DeclFn = __get_declfn<_Sequence, _Receiver>()
697+ >
698+ requires stdexec::__callable<decltype (_DeclFn)>
699+ || stdexec::tag_invocable<
700+ subscribe_t ,
701+ __transform_sender_result_t <_Sequence, _Receiver>,
702+ _Receiver
703+ >
704+ [[deprecated(" the use of tag_invoke for subscribe is deprecated" )]]
705+ auto operator ()(_Sequence&& __sequence, _Receiver&& __rcvr) const noexcept (
706+ __nothrow_callable<transform_sender_t , _Sequence, env_of_t <_Receiver>>
707+ && stdexec::nothrow_tag_invocable<
708+ subscribe_t ,
709+ __transform_sender_result_t <_Sequence, _Receiver>,
710+ _Receiver
711+ >)
712+ -> stdexec::tag_invoke_result_t<
713+ subscribe_t,
714+ __transform_sender_result_t<_Sequence, _Receiver>,
715+ _Receiver
716+ > {
717+ using __tfx_sequence_t = __transform_sender_result_t <_Sequence, _Receiver>;
718+ using __result_t = tag_invoke_result_t <subscribe_t , __tfx_sequence_t , _Receiver>;
719+ __check_operation_state<__result_t >();
720+ auto && __env = stdexec::get_env (__rcvr);
721+ auto && __tfx_sequence =
722+ stdexec::transform_sender (static_cast <_Sequence&&>(__sequence), __env);
723+ return stdexec::tag_invoke (
724+ subscribe_t {},
725+ static_cast <__tfx_sequence_t &&>(__tfx_sequence),
726+ static_cast <_Receiver&&>(__rcvr));
727+ }
728+
703729 static constexpr auto query (stdexec::forwarding_query_t ) noexcept -> bool {
704730 return false ;
705731 }
0 commit comments