From 135ff42003b5b16b7fb8a832354732414ff3d5e3 Mon Sep 17 00:00:00 2001 From: yulin25 Date: Sun, 23 Aug 2026 14:36:18 +0800 Subject: [PATCH] Fix __receiver_proxy_base start_scheduler_t query. * Return task_scheduler only when possible. * Return nullopt in other cases. * Terminate on exception. Add a regression test: parallel_scheduler used as the start scheduler in receiver_proxy's start_schedular_t query. --- include/stdexec/__detail/__task_scheduler.hpp | 13 +++++++------ test/stdexec/schedulers/test_parallel_scheduler.cpp | 7 +++++++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/include/stdexec/__detail/__task_scheduler.hpp b/include/stdexec/__detail/__task_scheduler.hpp index 476a2591d..5d002ddba 100644 --- a/include/stdexec/__detail/__task_scheduler.hpp +++ b/include/stdexec/__detail/__task_scheduler.hpp @@ -846,14 +846,15 @@ namespace STDEXEC { if (__value_type == __mtypeid) { - auto& __val = *static_cast*>(__dest); if constexpr (__callable>) { - __val.emplace(get_start_scheduler(get_env(__rcvr_))); - } - else - { - __val.emplace(inline_scheduler{}); + if constexpr (__std::constructible_from< + task_scheduler, + __call_result_t>>) + { + auto& __val = *static_cast*>(__dest); + __val.emplace(get_start_scheduler(get_env(__rcvr_))); + } } } } diff --git a/test/stdexec/schedulers/test_parallel_scheduler.cpp b/test/stdexec/schedulers/test_parallel_scheduler.cpp index 76bf85cc6..f01ea2ce6 100644 --- a/test/stdexec/schedulers/test_parallel_scheduler.cpp +++ b/test/stdexec/schedulers/test_parallel_scheduler.cpp @@ -94,6 +94,13 @@ TEST_CASE("trivial schedule task on parallel scheduler", "[scheduler][parallel_s ex::sync_wait(ex::schedule(sched)); } +TEST_CASE("can schedule from parallel scheduler to parallel scheduler", + "[scheduler][parallel_scheduler]") +{ + auto sched = ex::get_parallel_scheduler(); + ex::sync_wait(ex::starts_on(sched, ex::starts_on(sched, ex::just()))); +} + TEST_CASE("simple schedule task on parallel scheduler", "[scheduler][parallel_scheduler]") { std::thread::id this_id = std::this_thread::get_id();