From 708187d597872fd54b6fbe8c241158a9001c2e28 Mon Sep 17 00:00:00 2001 From: alwaysprince05 Date: Sun, 23 Aug 2026 00:56:18 +0530 Subject: [PATCH 1/3] fix(exec): any_sender completion signatures for sequence with 3+ senders When exec::sequence has 3+ senders, it recursively computes completion signatures by peeling off the first sender and querying the tail as a sub-sequence (__seq::__sndr). This tail holds child senders by const&. The get_completion_signatures discovery machinery passes the sender type un-decayed (as const any_sender&), but any_sender's constraint std::derived_from fails because reference types are never derived_from anything. Fix by decaying Self before the derived_from check in _isender::_interface_::get_completion_signatures(). Fixes #2101 --- include/exec/any_sender_of.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/exec/any_sender_of.hpp b/include/exec/any_sender_of.hpp index d39901304..01e91f93d 100644 --- a/include/exec/any_sender_of.hpp +++ b/include/exec/any_sender_of.hpp @@ -514,7 +514,8 @@ namespace experimental::execution using sender_concept = STDEXEC::sender_tag; using _base_t::_base_t; - template <__std::derived_from<_interface_> Self, class... Env> + template + requires std::derived_from, _interface_> static consteval auto get_completion_signatures() { // throw if Env does not contain the queries needed to type-erase the receiver: From 5158d0916e170e2ba91ef0893e8e4f850b66880a Mon Sep 17 00:00:00 2001 From: alwaysprince05 Date: Sun, 23 Aug 2026 10:51:18 +0530 Subject: [PATCH 2/3] Revert "fix(exec): any_sender completion signatures for sequence with 3+ senders" This reverts commit 708187d597872fd54b6fbe8c241158a9001c2e28. --- include/exec/any_sender_of.hpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/include/exec/any_sender_of.hpp b/include/exec/any_sender_of.hpp index 01e91f93d..d39901304 100644 --- a/include/exec/any_sender_of.hpp +++ b/include/exec/any_sender_of.hpp @@ -514,8 +514,7 @@ namespace experimental::execution using sender_concept = STDEXEC::sender_tag; using _base_t::_base_t; - template - requires std::derived_from, _interface_> + template <__std::derived_from<_interface_> Self, class... Env> static consteval auto get_completion_signatures() { // throw if Env does not contain the queries needed to type-erase the receiver: From 8dd53d1c468d28136b88e10ff61a4bc7b75f471b Mon Sep 17 00:00:00 2001 From: alwaysprince05 Date: Sun, 23 Aug 2026 10:55:06 +0530 Subject: [PATCH 3/3] fix(exec): sequence completion signatures for 3+ senders with any_sender When exec::sequence has 3+ senders, it recursively computes completion signatures by peeling off the first sender and querying the tail as a sub-sequence (__seq::__sndr). The nested sender types were passed by reference to get_completion_signatures, causing failures with any_sender whose get_completion_signatures requires a non-reference type. Fix by decaying sender types before passing to get_completion_signatures in __sndr::get_completion_signatures(). Fixes #2101 --- include/stdexec/__detail/__sequence.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/stdexec/__detail/__sequence.hpp b/include/stdexec/__detail/__sequence.hpp index e4c61fdeb..6243edcce 100644 --- a/include/stdexec/__detail/__sequence.hpp +++ b/include/stdexec/__detail/__sequence.hpp @@ -389,7 +389,7 @@ namespace STDEXEC // If the first sender has no set_value completions, then the second sender will // never be started, so just return the (error and stopped) completions of the // first sender. - return STDEXEC::get_completion_signatures<__cv_sender1_t, __fwd_env_t<_Env>...>(); + return STDEXEC::get_completion_signatures, __fwd_env_t<_Env>...>(); } else { @@ -398,11 +398,11 @@ namespace STDEXEC auto __completions1 = // STDEXEC::__transform_completion_signatures( - STDEXEC::get_completion_signatures<__cv_sender1_t, __fwd_env_t<_Env>...>(), + STDEXEC::get_completion_signatures, __fwd_env_t<_Env>...>(), __eat_value_signatures<_Self>{}); auto __completions2 = - STDEXEC::get_completion_signatures<_Sender2, __env2_t<_Self, _Env>...>(); + STDEXEC::get_completion_signatures, __env2_t<_Self, _Env>...>(); auto __eptr_completions = STDEXEC::__eptr_completion_unless_t<__mbool<__nothrow_connect2>>();