From a38e8ced7e3d25642ae03ecb35a2da5a6884db44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dietmar=20K=C3=BChl?= Date: Mon, 20 Apr 2026 22:41:27 +0100 Subject: [PATCH 01/10] fixed some types of when_all --- include/beman/execution/detail/when_all.hpp | 17 ++++++++++++++--- tests/beman/execution/exec-read-env.test.cpp | 20 ++++++++++++++++++++ tests/beman/execution/exec-when-all.test.cpp | 5 ++++- 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/include/beman/execution/detail/when_all.hpp b/include/beman/execution/detail/when_all.hpp index 47ce6fde..1813b367 100644 --- a/include/beman/execution/detail/when_all.hpp +++ b/include/beman/execution/detail/when_all.hpp @@ -16,6 +16,7 @@ import std; #include #include #include +#include //-dk:TODO remove #endif #ifdef BEMAN_HAS_MODULES import beman.execution.detail.basic_sender; @@ -47,6 +48,7 @@ import beman.execution.detail.meta.to; import beman.execution.detail.meta.transform; import beman.execution.detail.meta.unique; import beman.execution.detail.on_stop_request; +import beman.execution.detail.prop; import beman.execution.detail.sender; import beman.execution.detail.sender_in; import beman.execution.detail.sends_stopped; @@ -85,6 +87,7 @@ import beman.execution.detail.value_types_of_t; #include #include #include +#include #include #include #include @@ -117,13 +120,20 @@ concept valid_when_all_sender = ::beman::execution::dependent_sender || inline constexpr auto make_when_all_env = [](const ::beman::execution::inplace_stop_source& stop_src, const auto& env) noexcept { return ::beman::execution::detail::join_env( - ::beman::execution::detail::make_env(::beman::execution::get_stop_token, stop_src.get_token()), env); + ::beman::execution::env{::beman::execution::prop{::beman::execution::get_stop_token, stop_src.get_token()}}, + env); }; template using when_all_env = decltype(make_when_all_env(::std::declval<::beman::execution::inplace_stop_source>(), ::std::declval())); +static_assert(std::same_as<::beman::execution::never_stop_token, + decltype(::beman::execution::get_stop_token(::std::declval<::beman::execution::env<>>()))>); +static_assert(std::same_as<::beman::execution::inplace_stop_token, + decltype(::beman::execution::get_stop_token( + ::std::declval>>()))>); + struct when_all_t { template <::beman::execution::sender... Sender> requires(0u != sizeof...(Sender)) && (... && beman::execution::detail::valid_when_all_sender) && @@ -188,6 +198,7 @@ struct when_all_t { struct get_env_impl { template auto operator()(auto&&, State& state, const Receiver& receiver) const noexcept { + std::cout << "when_all::get_env()\n"; return make_when_all_env(state.stop_src, ::beman::execution::get_env(receiver)); } }; @@ -202,7 +213,7 @@ struct when_all_t { template struct state_type { struct nonesuch {}; - using env_t = ::beman::execution::env_of_t; + using env_t = when_all_env<::beman::execution::env_of_t>; using copy_fail = ::std::conditional_t< (... && ::beman::execution::value_types_of_t struct make_state { - template <::beman::execution::sender_in<::beman::execution::env_of_t>... Sender> + template <::beman::execution::sender_in>>... Sender> auto operator()(auto, auto, Sender&&...) const { return state_type{}; } diff --git a/tests/beman/execution/exec-read-env.test.cpp b/tests/beman/execution/exec-read-env.test.cpp index 13968254..2b7ae745 100644 --- a/tests/beman/execution/exec-read-env.test.cpp +++ b/tests/beman/execution/exec-read-env.test.cpp @@ -9,12 +9,15 @@ import beman.execution; #include #include #include +#include #include #include #include #include #include #include +#include +#include #endif // ---------------------------------------------------------------------------- @@ -74,7 +77,24 @@ auto test_read_env_completions() -> void { auto r{test_std::read_env(test_std::get_stop_token)}; test::check_type>( test_std::get_completion_signatures>()); + test::check_type>( + test_std::get_completion_signatures()); + test::check_type>( + test_std::get_completion_signatures()}})>()); + test::check_type>( + test_std::get_completion_signatures< + decltype(r), + decltype(test_detail::join_env( + test_std::env{test_std::prop{test_std::get_stop_token, std::declval()}}, + test_std::env{ + test_std::prop{test_std::get_stop_token, std::declval()}}))>()); test::use(r); + + test_std::sync_wait(test_std::read_env(test_std::get_stop_token)); + test_std::sync_wait(test_std::when_all(test_std::read_env(test_std::get_scheduler))); } } // namespace diff --git a/tests/beman/execution/exec-when-all.test.cpp b/tests/beman/execution/exec-when-all.test.cpp index cb6a1dea..6bf697fe 100644 --- a/tests/beman/execution/exec-when-all.test.cpp +++ b/tests/beman/execution/exec-when-all.test.cpp @@ -234,6 +234,10 @@ auto test_when_all() -> void { await_cancel(), add_value{test_std::just_stopped()}, test_std::just(true, 3.5)); + + test_std::sync_wait(test_std::read_env(test_std::get_stop_token)); + test_std::sync_wait( + test_std::when_all(test_std::read_env(test_std::get_stop_token) | test_std::then([](auto&&) {}))); } auto test_when_all_with_variant() -> void { @@ -265,7 +269,6 @@ TEST(exec_when_all) { static_assert(std::same_as); try { - test_when_all(); test_when_all_with_variant(); } catch (...) { From 7dc405b350ec923ff8b7aa5347bc6c31a07c847a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dietmar=20K=C3=BChl?= Date: Mon, 20 Apr 2026 22:45:25 +0100 Subject: [PATCH 02/10] removed debug output --- include/beman/execution/detail/when_all.hpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/include/beman/execution/detail/when_all.hpp b/include/beman/execution/detail/when_all.hpp index 1813b367..db794a28 100644 --- a/include/beman/execution/detail/when_all.hpp +++ b/include/beman/execution/detail/when_all.hpp @@ -16,7 +16,6 @@ import std; #include #include #include -#include //-dk:TODO remove #endif #ifdef BEMAN_HAS_MODULES import beman.execution.detail.basic_sender; @@ -198,7 +197,6 @@ struct when_all_t { struct get_env_impl { template auto operator()(auto&&, State& state, const Receiver& receiver) const noexcept { - std::cout << "when_all::get_env()\n"; return make_when_all_env(state.stop_src, ::beman::execution::get_env(receiver)); } }; From dcc595d53e64545985b36fd159c1434fd86df132 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dietmar=20K=C3=BChl?= Date: Mon, 20 Apr 2026 22:50:38 +0100 Subject: [PATCH 03/10] added missing import --- include/beman/execution/detail/when_all.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/include/beman/execution/detail/when_all.hpp b/include/beman/execution/detail/when_all.hpp index db794a28..e865fb98 100644 --- a/include/beman/execution/detail/when_all.hpp +++ b/include/beman/execution/detail/when_all.hpp @@ -46,6 +46,7 @@ import beman.execution.detail.meta.size; import beman.execution.detail.meta.to; import beman.execution.detail.meta.transform; import beman.execution.detail.meta.unique; +import beman.execution.detail.never_stop_token; import beman.execution.detail.on_stop_request; import beman.execution.detail.prop; import beman.execution.detail.sender; From 4b3f2f292b3ef7e56a5de0bd7a946cffc4908f54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dietmar=20K=C3=BChl?= Date: Mon, 20 Apr 2026 23:24:52 +0100 Subject: [PATCH 04/10] fixed the result computation using the stop token --- include/beman/execution/detail/when_all.hpp | 6 +++--- tests/beman/execution/exec-read-env.test.cpp | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/include/beman/execution/detail/when_all.hpp b/include/beman/execution/detail/when_all.hpp index e865fb98..c3bd2d67 100644 --- a/include/beman/execution/detail/when_all.hpp +++ b/include/beman/execution/detail/when_all.hpp @@ -166,12 +166,12 @@ struct when_all_t { using value_types = typename ::beman::execution::detail::when_all_value_types<::beman::execution::detail::meta::combine< ::beman::execution:: - value_types_of_t...>>:: + value_types_of_t, ::beman::execution::detail::type_list, ::std::type_identity_t>...>>:: type; using error_types = ::beman::execution::detail::meta::unique<::beman::execution::detail::meta::combine< - ::beman::execution::error_types_of_t...>>; + ::beman::execution::error_types_of_t, error_comps>...>>; using stopped_types = - ::std::conditional_t<(false || ... || ::beman::execution::sends_stopped), + ::std::conditional_t<(false || ... || ::beman::execution::sends_stopped>), ::beman::execution::completion_signatures<::beman::execution::set_stopped_t()>, ::beman::execution::completion_signatures<>>; using type = ::beman::execution::detail::meta::combine; diff --git a/tests/beman/execution/exec-read-env.test.cpp b/tests/beman/execution/exec-read-env.test.cpp index 2b7ae745..aa1a4a80 100644 --- a/tests/beman/execution/exec-read-env.test.cpp +++ b/tests/beman/execution/exec-read-env.test.cpp @@ -5,6 +5,7 @@ #include #ifdef BEMAN_HAS_MODULES import beman.execution; +import beman.execution.detail.join_env; #else #include #include @@ -94,6 +95,7 @@ auto test_read_env_completions() -> void { test::use(r); test_std::sync_wait(test_std::read_env(test_std::get_stop_token)); + test_std::sync_wait(test_std::when_all(test_std::read_env(test_std::get_stop_token))); test_std::sync_wait(test_std::when_all(test_std::read_env(test_std::get_scheduler))); } } // namespace From ac3bc0ca4e40d2ff87f4465b762ced6af1eefc17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dietmar=20K=C3=BChl?= Date: Mon, 20 Apr 2026 23:26:23 +0100 Subject: [PATCH 05/10] clang format --- include/beman/execution/detail/when_all.hpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/include/beman/execution/detail/when_all.hpp b/include/beman/execution/detail/when_all.hpp index c3bd2d67..ec6ab4be 100644 --- a/include/beman/execution/detail/when_all.hpp +++ b/include/beman/execution/detail/when_all.hpp @@ -165,9 +165,10 @@ struct when_all_t { using value_types = typename ::beman::execution::detail::when_all_value_types<::beman::execution::detail::meta::combine< - ::beman::execution:: - value_types_of_t, ::beman::execution::detail::type_list, ::std::type_identity_t>...>>:: - type; + ::beman::execution::value_types_of_t, + ::beman::execution::detail::type_list, + ::std::type_identity_t>...>>::type; using error_types = ::beman::execution::detail::meta::unique<::beman::execution::detail::meta::combine< ::beman::execution::error_types_of_t, error_comps>...>>; using stopped_types = From 4e0bbf3893f669987e2d1a2828868677d1937989 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dietmar=20K=C3=BChl?= Date: Tue, 21 Apr 2026 00:50:16 +0100 Subject: [PATCH 06/10] constrained sender_decompose to be only used with basic_sender --- include/beman/execution/detail/basic_sender.hpp | 1 + .../beman/execution/detail/inline_scheduler.hpp | 5 ----- .../beman/execution/detail/sender_decompose.hpp | 5 ++++- .../beman/execution/exec-domain-default.test.cpp | 1 + tests/beman/execution/exec-snd-concepts.test.cpp | 10 ++++++++++ tests/beman/execution/exec-snd-expos.test.cpp | 16 ++++++++++++++++ .../beman/execution/exec-snd-transform.test.cpp | 1 + 7 files changed, 33 insertions(+), 6 deletions(-) diff --git a/include/beman/execution/detail/basic_sender.hpp b/include/beman/execution/detail/basic_sender.hpp index 5f46cf82..945473ee 100644 --- a/include/beman/execution/detail/basic_sender.hpp +++ b/include/beman/execution/detail/basic_sender.hpp @@ -67,6 +67,7 @@ template struct basic_sender : ::beman::execution::detail::product_type { //-dk:TODO friend struct ::beman::execution::detail::connect_t; using sender_concept = ::beman::execution::sender_t; + using is_basic_sender_tag = void; //-dk:TODO need a better way to detect this is a basic sender using indices_for = ::std::index_sequence_for; static constexpr ::std::integral_constant<::std::size_t, sizeof...(Child) + 2> size{}; diff --git a/include/beman/execution/detail/inline_scheduler.hpp b/include/beman/execution/detail/inline_scheduler.hpp index 06f8df17..ac2d364f 100644 --- a/include/beman/execution/detail/inline_scheduler.hpp +++ b/include/beman/execution/detail/inline_scheduler.hpp @@ -60,11 +60,6 @@ struct inline_scheduler { static constexpr auto get_env() noexcept -> env { return {}; } - template - static consteval auto get_completion_signatures() noexcept -> completion_signatures { - return {}; - } - template <::beman::execution::receiver Rcvr> auto connect(Rcvr&& receiver) noexcept(::std::is_nothrow_constructible_v<::std::remove_cvref_t, Rcvr>) -> state { diff --git a/include/beman/execution/detail/sender_decompose.hpp b/include/beman/execution/detail/sender_decompose.hpp index ef5f47ce..9fbe9b3a 100644 --- a/include/beman/execution/detail/sender_decompose.hpp +++ b/include/beman/execution/detail/sender_decompose.hpp @@ -51,7 +51,10 @@ auto get_sender_data(Sender&& sender) { using sender_type = ::std::remove_cvref_t; static constexpr ::beman::execution::detail::sender_convert_to_any_t at{}; - if constexpr (requires { + if constexpr (!requires { typename sender_type::is_basic_sender_tag; }) { + return ::beman::execution::detail::sender_meta{}; + } + else if constexpr (requires { sender.template get<0>(); sender.size(); }) diff --git a/tests/beman/execution/exec-domain-default.test.cpp b/tests/beman/execution/exec-domain-default.test.cpp index f9ae8657..81a12227 100644 --- a/tests/beman/execution/exec-domain-default.test.cpp +++ b/tests/beman/execution/exec-domain-default.test.cpp @@ -63,6 +63,7 @@ struct tag { template struct tagged_sender { using sender_concept = test_std::sender_t; + using is_basic_sender_tag = void; tag t{}; int value{17}; int args{}; diff --git a/tests/beman/execution/exec-snd-concepts.test.cpp b/tests/beman/execution/exec-snd-concepts.test.cpp index 03ebd99c..29191b0b 100644 --- a/tests/beman/execution/exec-snd-concepts.test.cpp +++ b/tests/beman/execution/exec-snd-concepts.test.cpp @@ -34,17 +34,20 @@ struct own_sender { struct tag_t {}; struct tagged_sender { using sender_concept = test_std::sender_t; + using is_basic_sender_tag = void; tag_t tag; int data; }; struct tagged_sender1 { using sender_concept = test_std::sender_t; + using is_basic_sender_tag = void; tag_t tag; int data; int child1; }; struct tagged_sender2 { using sender_concept = test_std::sender_t; + using is_basic_sender_tag = void; tag_t tag; int data; int child1; @@ -52,6 +55,7 @@ struct tagged_sender2 { }; struct tagged_sender3 { using sender_concept = test_std::sender_t; + using is_basic_sender_tag = void; tag_t tag; int data; int child1; @@ -60,6 +64,7 @@ struct tagged_sender3 { }; struct tagged_sender4 { using sender_concept = test_std::sender_t; + using is_basic_sender_tag = void; tag_t tag; int data; int child1; @@ -69,18 +74,23 @@ struct tagged_sender4 { }; struct product_sender0 : test_detail::product_type { using sender_concept = test_std::sender_t; + using is_basic_sender_tag = void; }; struct product_sender1 : test_detail::product_type { using sender_concept = test_std::sender_t; + using is_basic_sender_tag = void; }; struct product_sender2 : test_detail::product_type { using sender_concept = test_std::sender_t; + using is_basic_sender_tag = void; }; struct product_sender3 : test_detail::product_type { using sender_concept = test_std::sender_t; + using is_basic_sender_tag = void; }; struct product_sender4 : test_detail::product_type { using sender_concept = test_std::sender_t; + using is_basic_sender_tag = void; }; // ------------------------------------------------------------------------- diff --git a/tests/beman/execution/exec-snd-expos.test.cpp b/tests/beman/execution/exec-snd-expos.test.cpp index aca8b075..dbfbddda 100644 --- a/tests/beman/execution/exec-snd-expos.test.cpp +++ b/tests/beman/execution/exec-snd-expos.test.cpp @@ -113,6 +113,7 @@ struct operation_state : test_detail::immovable { struct sender0 { struct env {}; using sender_concept = test_std::sender_t; + using is_basic_sender_tag = void; using indices_for = ::std::index_sequence_for<>; tag t{}; int* data{}; @@ -125,6 +126,7 @@ struct sender0 { struct sender1 { using sender_concept = test_std::sender_t; + using is_basic_sender_tag = void; using indices_for = ::std::index_sequence_for; tag t{}; int* data{}; @@ -137,6 +139,7 @@ struct sender1 { struct sender2 { using sender_concept = test_std::sender_t; + using is_basic_sender_tag = void; using indices_for = ::std::index_sequence_for; tag t{}; int* data{}; @@ -150,6 +153,7 @@ struct sender2 { struct sender3 { using sender_concept = test_std::sender_t; + using is_basic_sender_tag = void; using indices_for = ::std::index_sequence_for; tag t{}; int* data{}; @@ -164,6 +168,7 @@ struct sender3 { struct sender4 { using sender_concept = test_std::sender_t; + using is_basic_sender_tag = void; using indices_for = ::std::index_sequence_for; tag t{}; int* data{}; @@ -547,21 +552,25 @@ auto test_default_impls_get_state() -> void { auto operator==(const data&) const -> bool = default; }; struct local_sender0 { + using is_basic_sender_tag = void; local_tag t{}; data d{1, 2}; }; struct local_sender1 { + using is_basic_sender_tag = void; local_tag t{}; data d{1, 2}; int i1{}; }; struct local_sender2 { + using is_basic_sender_tag = void; local_tag t{}; data d{1, 2}; int i1{}; int i2{}; }; struct local_sender3 { + using is_basic_sender_tag = void; local_tag t{}; data d{1, 2}; int i1{}; @@ -569,6 +578,7 @@ auto test_default_impls_get_state() -> void { int i3{}; }; struct local_sender4 { + using is_basic_sender_tag = void; local_tag t{}; data d{1, 2}; int i1{}; @@ -665,6 +675,7 @@ auto test_state_type() -> void { }; struct state {}; struct sender { + using is_basic_sender_tag = void; local_tag t; state s; }; @@ -679,6 +690,7 @@ auto test_basic_state() -> void { }; struct data {}; struct local_sender { + using is_basic_sender_tag = void; local_tag t; data d; }; @@ -717,10 +729,12 @@ auto test_env_type() -> void { struct data {}; struct local_env {}; struct local_sender { + using is_basic_sender_tag = void; local_tag t; data d; }; struct sender_with_env { + using is_basic_sender_tag = void; local_tag t; data d; auto get_env() const noexcept -> local_env { return {}; } @@ -750,6 +764,7 @@ auto test_basic_receiver() -> void { auto operator==(const err&) const -> bool = default; }; struct local_sender { + using is_basic_sender_tag = void; local_tag t{}; data d{}; }; @@ -1099,6 +1114,7 @@ struct basic_sender_tag { struct data {}; struct tagged_sender : test_detail::product_type { using sender_concept = test_std::sender_t; + using is_basic_sender_tag = void; }; } // namespace namespace std { diff --git a/tests/beman/execution/exec-snd-transform.test.cpp b/tests/beman/execution/exec-snd-transform.test.cpp index 6526dd9f..9dbb0b0a 100644 --- a/tests/beman/execution/exec-snd-transform.test.cpp +++ b/tests/beman/execution/exec-snd-transform.test.cpp @@ -45,6 +45,7 @@ struct tag { template struct sender { using sender_concept = test_std::sender_t; + using is_basic_sender_tag = void; using index_type = std::integral_constant; tag t; int value{}; From 20a4c7647db9b8d727a39904301628deaa68a8a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dietmar=20K=C3=BChl?= Date: Tue, 21 Apr 2026 21:24:25 +0100 Subject: [PATCH 07/10] fixed a problem with the store_receiver ... get_completion_signatures --- include/beman/execution/detail/store_receiver.hpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/include/beman/execution/detail/store_receiver.hpp b/include/beman/execution/detail/store_receiver.hpp index 62e4c181..d869fb9f 100644 --- a/include/beman/execution/detail/store_receiver.hpp +++ b/include/beman/execution/detail/store_receiver.hpp @@ -79,13 +79,14 @@ struct store_receiver_t { template <::beman::execution::sender Sndr, typename Trans> struct sender { using sender_concept = ::beman::execution::sender_t; - template - static consteval auto get_completion_signatures(Env&&... env) noexcept { + using trans_t = ::std::remove_cvref_t; + template + static consteval auto get_completion_signatures() noexcept { return ::beman::execution:: - get_completion_signatures()(::std::declval())), Env...>(); + get_completion_signatures()(::std::declval(), ::std::declval()...)), Env...>(); } ::std::remove_cvref_t sndr; - ::std::remove_cvref_t trans; + trans_t trans; template <::beman::execution::receiver Receiver> auto connect(Receiver&& r) && { From 0cad90aa2c6be008ad8f7e90bbfa41be446940ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dietmar=20K=C3=BChl?= Date: Tue, 21 Apr 2026 21:47:01 +0100 Subject: [PATCH 08/10] clang format --- .../beman/execution/detail/basic_sender.hpp | 4 ++-- .../execution/detail/sender_decompose.hpp | 9 ++++---- .../beman/execution/detail/store_receiver.hpp | 11 +++++----- .../execution/exec-domain-default.test.cpp | 2 +- .../execution/exec-snd-concepts.test.cpp | 20 ++++++++--------- tests/beman/execution/exec-snd-expos.test.cpp | 22 +++++++++---------- .../execution/exec-snd-transform.test.cpp | 4 ++-- 7 files changed, 36 insertions(+), 36 deletions(-) diff --git a/include/beman/execution/detail/basic_sender.hpp b/include/beman/execution/detail/basic_sender.hpp index 945473ee..46adf852 100644 --- a/include/beman/execution/detail/basic_sender.hpp +++ b/include/beman/execution/detail/basic_sender.hpp @@ -66,9 +66,9 @@ inline constexpr sub_apply_t sub_apply{}; template struct basic_sender : ::beman::execution::detail::product_type { //-dk:TODO friend struct ::beman::execution::detail::connect_t; - using sender_concept = ::beman::execution::sender_t; + using sender_concept = ::beman::execution::sender_t; using is_basic_sender_tag = void; //-dk:TODO need a better way to detect this is a basic sender - using indices_for = ::std::index_sequence_for; + using indices_for = ::std::index_sequence_for; static constexpr ::std::integral_constant<::std::size_t, sizeof...(Child) + 2> size{}; auto get_env() const noexcept -> decltype(auto) { diff --git a/include/beman/execution/detail/sender_decompose.hpp b/include/beman/execution/detail/sender_decompose.hpp index 9fbe9b3a..d5cb0f6e 100644 --- a/include/beman/execution/detail/sender_decompose.hpp +++ b/include/beman/execution/detail/sender_decompose.hpp @@ -53,11 +53,10 @@ auto get_sender_data(Sender&& sender) { if constexpr (!requires { typename sender_type::is_basic_sender_tag; }) { return ::beman::execution::detail::sender_meta{}; - } - else if constexpr (requires { - sender.template get<0>(); - sender.size(); - }) + } else if constexpr (requires { + sender.template get<0>(); + sender.size(); + }) return [&sender]<::std::size_t... I>(::std::index_sequence) { return ::beman::execution::detail::sender_data{ sender.template get<0>(), sender.template get<1>(), ::std::tie(sender.template get<2 + I>()...)}; diff --git a/include/beman/execution/detail/store_receiver.hpp b/include/beman/execution/detail/store_receiver.hpp index d869fb9f..54d88941 100644 --- a/include/beman/execution/detail/store_receiver.hpp +++ b/include/beman/execution/detail/store_receiver.hpp @@ -79,14 +79,15 @@ struct store_receiver_t { template <::beman::execution::sender Sndr, typename Trans> struct sender { using sender_concept = ::beman::execution::sender_t; - using trans_t = ::std::remove_cvref_t; + using trans_t = ::std::remove_cvref_t; template static consteval auto get_completion_signatures() noexcept { - return ::beman::execution:: - get_completion_signatures()(::std::declval(), ::std::declval()...)), Env...>(); + return ::beman::execution::get_completion_signatures< + decltype(::std::declval()(::std::declval(), ::std::declval()...)), + Env...>(); } - ::std::remove_cvref_t sndr; - trans_t trans; + ::std::remove_cvref_t sndr; + trans_t trans; template <::beman::execution::receiver Receiver> auto connect(Receiver&& r) && { diff --git a/tests/beman/execution/exec-domain-default.test.cpp b/tests/beman/execution/exec-domain-default.test.cpp index 81a12227..57042766 100644 --- a/tests/beman/execution/exec-domain-default.test.cpp +++ b/tests/beman/execution/exec-domain-default.test.cpp @@ -62,7 +62,7 @@ struct tag { template struct tagged_sender { - using sender_concept = test_std::sender_t; + using sender_concept = test_std::sender_t; using is_basic_sender_tag = void; tag t{}; int value{17}; diff --git a/tests/beman/execution/exec-snd-concepts.test.cpp b/tests/beman/execution/exec-snd-concepts.test.cpp index 29191b0b..5a3a2be7 100644 --- a/tests/beman/execution/exec-snd-concepts.test.cpp +++ b/tests/beman/execution/exec-snd-concepts.test.cpp @@ -33,20 +33,20 @@ struct own_sender { struct tag_t {}; struct tagged_sender { - using sender_concept = test_std::sender_t; + using sender_concept = test_std::sender_t; using is_basic_sender_tag = void; tag_t tag; int data; }; struct tagged_sender1 { - using sender_concept = test_std::sender_t; + using sender_concept = test_std::sender_t; using is_basic_sender_tag = void; tag_t tag; int data; int child1; }; struct tagged_sender2 { - using sender_concept = test_std::sender_t; + using sender_concept = test_std::sender_t; using is_basic_sender_tag = void; tag_t tag; int data; @@ -54,7 +54,7 @@ struct tagged_sender2 { int child2; }; struct tagged_sender3 { - using sender_concept = test_std::sender_t; + using sender_concept = test_std::sender_t; using is_basic_sender_tag = void; tag_t tag; int data; @@ -63,7 +63,7 @@ struct tagged_sender3 { int child3; }; struct tagged_sender4 { - using sender_concept = test_std::sender_t; + using sender_concept = test_std::sender_t; using is_basic_sender_tag = void; tag_t tag; int data; @@ -73,23 +73,23 @@ struct tagged_sender4 { int child4; }; struct product_sender0 : test_detail::product_type { - using sender_concept = test_std::sender_t; + using sender_concept = test_std::sender_t; using is_basic_sender_tag = void; }; struct product_sender1 : test_detail::product_type { - using sender_concept = test_std::sender_t; + using sender_concept = test_std::sender_t; using is_basic_sender_tag = void; }; struct product_sender2 : test_detail::product_type { - using sender_concept = test_std::sender_t; + using sender_concept = test_std::sender_t; using is_basic_sender_tag = void; }; struct product_sender3 : test_detail::product_type { - using sender_concept = test_std::sender_t; + using sender_concept = test_std::sender_t; using is_basic_sender_tag = void; }; struct product_sender4 : test_detail::product_type { - using sender_concept = test_std::sender_t; + using sender_concept = test_std::sender_t; using is_basic_sender_tag = void; }; diff --git a/tests/beman/execution/exec-snd-expos.test.cpp b/tests/beman/execution/exec-snd-expos.test.cpp index dbfbddda..517b73c3 100644 --- a/tests/beman/execution/exec-snd-expos.test.cpp +++ b/tests/beman/execution/exec-snd-expos.test.cpp @@ -112,9 +112,9 @@ struct operation_state : test_detail::immovable { struct sender0 { struct env {}; - using sender_concept = test_std::sender_t; + using sender_concept = test_std::sender_t; using is_basic_sender_tag = void; - using indices_for = ::std::index_sequence_for<>; + using indices_for = ::std::index_sequence_for<>; tag t{}; int* data{}; template @@ -125,9 +125,9 @@ struct sender0 { }; struct sender1 { - using sender_concept = test_std::sender_t; + using sender_concept = test_std::sender_t; using is_basic_sender_tag = void; - using indices_for = ::std::index_sequence_for; + using indices_for = ::std::index_sequence_for; tag t{}; int* data{}; sender0 c0{}; @@ -138,9 +138,9 @@ struct sender1 { }; struct sender2 { - using sender_concept = test_std::sender_t; + using sender_concept = test_std::sender_t; using is_basic_sender_tag = void; - using indices_for = ::std::index_sequence_for; + using indices_for = ::std::index_sequence_for; tag t{}; int* data{}; sender0 c0{}; @@ -152,9 +152,9 @@ struct sender2 { }; struct sender3 { - using sender_concept = test_std::sender_t; + using sender_concept = test_std::sender_t; using is_basic_sender_tag = void; - using indices_for = ::std::index_sequence_for; + using indices_for = ::std::index_sequence_for; tag t{}; int* data{}; sender0 c0{}; @@ -167,9 +167,9 @@ struct sender3 { }; struct sender4 { - using sender_concept = test_std::sender_t; + using sender_concept = test_std::sender_t; using is_basic_sender_tag = void; - using indices_for = ::std::index_sequence_for; + using indices_for = ::std::index_sequence_for; tag t{}; int* data{}; sender0 c0{}; @@ -1113,7 +1113,7 @@ struct basic_sender_tag { struct data {}; struct tagged_sender : test_detail::product_type { - using sender_concept = test_std::sender_t; + using sender_concept = test_std::sender_t; using is_basic_sender_tag = void; }; } // namespace diff --git a/tests/beman/execution/exec-snd-transform.test.cpp b/tests/beman/execution/exec-snd-transform.test.cpp index 9dbb0b0a..2a1a2497 100644 --- a/tests/beman/execution/exec-snd-transform.test.cpp +++ b/tests/beman/execution/exec-snd-transform.test.cpp @@ -44,9 +44,9 @@ struct tag { template struct sender { - using sender_concept = test_std::sender_t; + using sender_concept = test_std::sender_t; using is_basic_sender_tag = void; - using index_type = std::integral_constant; + using index_type = std::integral_constant; tag t; int value{}; }; From 3b2b83cac34ec7314bb894a5ff1f56f442915ef7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dietmar=20K=C3=BChl?= Date: Tue, 21 Apr 2026 21:48:23 +0100 Subject: [PATCH 09/10] removed a debugging template argument --- include/beman/execution/detail/sender_decompose.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/beman/execution/detail/sender_decompose.hpp b/include/beman/execution/detail/sender_decompose.hpp index d5cb0f6e..16137c81 100644 --- a/include/beman/execution/detail/sender_decompose.hpp +++ b/include/beman/execution/detail/sender_decompose.hpp @@ -52,7 +52,7 @@ auto get_sender_data(Sender&& sender) { static constexpr ::beman::execution::detail::sender_convert_to_any_t at{}; if constexpr (!requires { typename sender_type::is_basic_sender_tag; }) { - return ::beman::execution::detail::sender_meta{}; + return ::beman::execution::detail::sender_meta{}; } else if constexpr (requires { sender.template get<0>(); sender.size(); From 1245ba51a2e4e610888d44160db53798b614bc2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dietmar=20K=C3=BChl?= Date: Tue, 21 Apr 2026 22:27:11 +0100 Subject: [PATCH 10/10] fix an odd strict warning --- tests/beman/execution/exec-snd-expos.test.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/beman/execution/exec-snd-expos.test.cpp b/tests/beman/execution/exec-snd-expos.test.cpp index 517b73c3..67de17a6 100644 --- a/tests/beman/execution/exec-snd-expos.test.cpp +++ b/tests/beman/execution/exec-snd-expos.test.cpp @@ -764,9 +764,9 @@ auto test_basic_receiver() -> void { auto operator==(const err&) const -> bool = default; }; struct local_sender { - using is_basic_sender_tag = void; - local_tag t{}; - data d{}; + using is_basic_sender_tag = local_tag; + is_basic_sender_tag t{}; + data d{}; }; struct local_receiver { T value{}; @@ -781,6 +781,7 @@ auto test_basic_receiver() -> void { T value; }; using basic_receiver = test_detail::basic_receiver; + static_assert(requires { typename local_sender::is_basic_sender_tag; }); static_assert(test_std::receiver); static_assert(std::same_as); static_assert(