@@ -319,6 +319,58 @@ namespace
319319 ex::sender auto snd = ex::starts_on (is, ex::just ()) | ex::then ([] {});
320320 ex::sync_wait (std::move (snd));
321321 }
322+
323+ // A sender that completes asynchronously on the same execution context that started it
324+ struct affine_sender
325+ {
326+ using sender_concept = ex::sender_tag;
327+ using completion_signatures = ex::completion_signatures<ex::set_value_t ()>;
328+
329+ struct attrs
330+ {
331+ template <class Tag , class ... Env>
332+ static auto query (ex::__get_completion_behavior_t <Tag>, Env&&...) noexcept
333+ {
334+ return ex::__completion_behavior::__asynchronous_affine;
335+ }
336+ };
337+
338+ template <class Receiver >
339+ static auto connect (Receiver rcvr)
340+ {
341+ return ex::connect (ex::just (), static_cast <Receiver&&>(rcvr));
342+ }
343+
344+ [[nodiscard]]
345+ static auto get_env () noexcept -> attrs
346+ {
347+ return {};
348+ }
349+ };
350+
351+ TEST_CASE (" starts_on completion domain agrees with its completion scheduler when the child "
352+ " completes where it starts" ,
353+ " [adaptors][starts_on]" )
354+ {
355+ exec::static_thread_pool pool{1 };
356+ auto sched = pool.get_scheduler ();
357+ using sched_t = decltype (sched);
358+ using sched_domain_t =
359+ ex::__call_result_t <ex::get_completion_domain_t <ex::set_value_t >, sched_t , ex::env<>>;
360+
361+ auto snd = ex::starts_on (sched, affine_sender{});
362+ using attrs_t = ex::env_of_t <decltype (snd)>;
363+
364+ using cmpl_sched_t =
365+ ex::__call_result_t <ex::get_completion_scheduler_t <ex::set_value_t >, attrs_t , ex::env<>>;
366+ using cmpl_domain_t =
367+ ex::__call_result_t <ex::get_completion_domain_t <ex::set_value_t >, attrs_t , ex::env<>>;
368+ STATIC_REQUIRE (std::same_as<cmpl_sched_t , sched_t >);
369+ STATIC_REQUIRE (std::same_as<cmpl_domain_t , sched_domain_t >);
370+ CHECK (ex::get_completion_scheduler<ex::set_value_t >(ex::get_env (snd), ex::env<>{}) == sched);
371+
372+ ex::sync_wait (std::move (snd));
373+ }
322374} // namespace
323375
324376STDEXEC_PRAGMA_POP ()
0 commit comments