From 1a22a2fca757b6287ab5b6cf0b2431db66419193 Mon Sep 17 00:00:00 2001 From: Ahmed Hussein Date: Sun, 17 May 2026 22:20:17 +0300 Subject: [PATCH 01/11] Refactor __tuple and add __apply_partial_t for improved function application --- include/stdexec/__detail/__tuple.hpp | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/include/stdexec/__detail/__tuple.hpp b/include/stdexec/__detail/__tuple.hpp index 4374c9f45..65becb2ad 100644 --- a/include/stdexec/__detail/__tuple.hpp +++ b/include/stdexec/__detail/__tuple.hpp @@ -77,7 +77,7 @@ namespace STDEXEC template struct __tuple : __tup::__tupl_base<__make_indices, _Ts...> - {}; + { }; template <> struct __tuple<> @@ -453,15 +453,27 @@ namespace STDEXEC // namespace __tup { + template + struct __apply_partial_t + { + _Tuple&& __tup; + _Fn __fn; + + template + STDEXEC_ATTRIBUTE(host, device, always_inline) + constexpr auto operator()(_Us&&... __us) noexcept(__nothrow_applicable<_Fn, _Tuple, _Us...>) + -> __apply_result_t<_Fn, _Tuple, _Us...> + { + return STDEXEC::__apply(__fn, static_cast<_Tuple&&>(__tup), static_cast<_Us&&>(__us)...); + } + }; + template <__is_tuple _Tuple, class _Fn> STDEXEC_ATTRIBUTE(host, device, always_inline) constexpr auto operator%(_Tuple&& __tup, _Fn __fn) noexcept(__nothrow_move_constructible<_Fn>) + -> __apply_partial_t<_Fn, _Tuple> { - return [&__tup, __fn = static_cast<_Fn&&>(__fn)](_Us&&... __us) noexcept( - __nothrow_applicable<_Fn, _Tuple, _Us...>) -> __apply_result_t<_Fn, _Tuple, _Us...> - { - return STDEXEC::__apply(__fn, static_cast<_Tuple&&>(__tup), static_cast<_Us&&>(__us)...); - }; + return __apply_partial_t<_Fn, _Tuple>{static_cast<_Tuple&&>(__tup), static_cast<_Fn&&>(__fn)}; } struct __cat_apply_t From 4fc447d7c14c4df1f87ad5e95eee1381fd673573 Mon Sep 17 00:00:00 2001 From: Ahmed Hussein Date: Sun, 17 May 2026 22:28:54 +0300 Subject: [PATCH 02/11] Add static stopped callback to coroutine handle for improved coroutine management --- include/stdexec/coroutine.hpp | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/include/stdexec/coroutine.hpp b/include/stdexec/coroutine.hpp index 1ea3759db..9cbbde957 100644 --- a/include/stdexec/coroutine.hpp +++ b/include/stdexec/coroutine.hpp @@ -88,6 +88,17 @@ namespace STDEXEC public: constexpr __coroutine_handle() = default; + template + static constexpr auto __stopped_callback(void* __address) noexcept -> __std::coroutine_handle<> + { + // This causes the rest of the coroutine (the part after the co_await + // of the sender) to be skipped and invokes the calling coroutine's + // stopped handler. + return __std::coroutine_handle<_Promise>::from_address(__address) + .promise() + .unhandled_stopped(); + } + template constexpr __coroutine_handle(__std::coroutine_handle<_Promise> __coro) noexcept : __std::coroutine_handle<>(__coro) @@ -98,15 +109,7 @@ namespace STDEXEC if constexpr (__has_unhandled_stopped) { - __stopped_callback_ = [](void* __address) noexcept -> __std::coroutine_handle<> - { - // This causes the rest of the coroutine (the part after the co_await - // of the sender) to be skipped and invokes the calling coroutine's - // stopped handler. - return __std::coroutine_handle<_Promise>::from_address(__address) - .promise() - .unhandled_stopped(); - }; + __stopped_callback_ = &__stopped_callback<_Promise>; } // If _Promise doesn't implement unhandled_stopped(), then if a "stopped" unwind // reaches this point, it's considered an unhandled exception and terminate() @@ -142,7 +145,7 @@ namespace STDEXEC constexpr __coroutine_handle(__std::coroutine_handle<_Promise> __coro) noexcept : __coroutine_handle<>{__coro} - {} + { } [[nodiscard]] static constexpr auto from_promise(_Promise& __promise) noexcept -> __coroutine_handle @@ -178,7 +181,7 @@ namespace STDEXEC __callback_fn_t* __resume_ = &__noop_fn; __callback_fn_t* __destroy_ = &__noop_fn; - static void __noop_fn(void*) noexcept {} + static void __noop_fn(void*) noexcept { } }; static constexpr std::ptrdiff_t __coro_promise_offset = static_cast( From 9c30c371b79b45d182b02739028c985e9670c2dc Mon Sep 17 00:00:00 2001 From: Ahmed Hussein Date: Sun, 17 May 2026 22:33:03 +0300 Subject: [PATCH 03/11] Refactor __completion_info constructor and add __completion_sigs_splice for improved signature handling --- include/stdexec/__detail/__completion_info.hpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/include/stdexec/__detail/__completion_info.hpp b/include/stdexec/__detail/__completion_info.hpp index e846b7963..caf4060a2 100644 --- a/include/stdexec/__detail/__completion_info.hpp +++ b/include/stdexec/__detail/__completion_info.hpp @@ -57,7 +57,7 @@ namespace STDEXEC , __signature(__mtypeid<_Tag(_Args...)>) , __domain(__domain) , __behavior(__behavior) - {} + { } template constexpr auto __populate() noexcept -> __completion_info & @@ -126,17 +126,19 @@ namespace STDEXEC } }(); + template + consteval auto __completion_sigs_splice(__indices<_Is...>) noexcept + { + return completion_signatures<__msplice<__sigs[_Is]>...>(); + } + template consteval auto __completion_sigs_from(_GetComplInfo) noexcept { constexpr auto __sigs = __completion_sigs_from_v<(_GetComplInfo())>; STDEXEC_IF_OK(__sigs) { - constexpr auto __fn = [=](__indices<_Is...>) - { - return completion_signatures<__msplice<__sigs[_Is]>...>(); - }; - return __fn(__make_indices<__sigs.size()>()); + return __completion_sigs_splice<__sigs>(__make_indices<__sigs.size()>()); } } From c7077c88a9759f6abac4dcba0fe123ecbca73a33 Mon Sep 17 00:00:00 2001 From: Ahmed Hussein Date: Sun, 17 May 2026 23:05:43 +0300 Subject: [PATCH 04/11] Refactor __monostate and __variant constructors for improved formatting and add __emplace_from_fn for enhanced function emplacement --- include/stdexec/__detail/__variant.hpp | 31 +++++++++++++++++++++----- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/include/stdexec/__detail/__variant.hpp b/include/stdexec/__detail/__variant.hpp index cbe5cab04..8b33b3c43 100644 --- a/include/stdexec/__detail/__variant.hpp +++ b/include/stdexec/__detail/__variant.hpp @@ -48,7 +48,7 @@ namespace STDEXEC #endif struct __monostate - {}; + { }; struct __visit_t { @@ -102,7 +102,7 @@ namespace STDEXEC { public: STDEXEC_ATTRIBUTE(host, device) - constexpr __variant(__no_init_t) noexcept {} + constexpr __variant(__no_init_t) noexcept { } template STDEXEC_ATTRIBUTE(host, device) @@ -169,7 +169,7 @@ namespace STDEXEC // Construct into the valueless state: STDEXEC_ATTRIBUTE(host, device) - constexpr explicit __variant(__no_init_t) noexcept {} + constexpr explicit __variant(__no_init_t) noexcept { } STDEXEC_ATTRIBUTE(host, device) constexpr __variant(__variant &&__other) noexcept(__nothrow_move_constructible<_Ts...>) @@ -298,6 +298,27 @@ namespace STDEXEC return *std::launder(__ptr); } + template + struct __emplace_from_fn + { + _Fn &__fn_; + std::tuple<_As &...> __as_; + + static constexpr bool __is_nothrow = __nothrow_callable<_Fn, _As...>; + + template + constexpr auto + __call(std::index_sequence<_Size...>) const noexcept(__is_nothrow) -> decltype(auto) + { + return static_cast<_Fn &&>(__fn_)(static_cast<_As &&>(std::get<_Size>(__as_))...); + } + + constexpr auto operator()() const noexcept(__is_nothrow) -> decltype(auto) + { + return __call(std::index_sequence_for<_As...>{}); + } + }; + template STDEXEC_ATTRIBUTE(host, device) constexpr auto __emplace_from(_Fn &&__fn, _As &&...__as) @@ -314,9 +335,7 @@ namespace STDEXEC { auto *__ptr = std::construct_at<__value_t>( static_cast<__value_t *>(__data()), - STDEXEC::__emplace_from( - [&]() noexcept(__is_nothrow) -> decltype(auto) - { return static_cast<_Fn &&>(__fn)(static_cast<_As &&>(__as)...); })); + STDEXEC::__emplace_from(__emplace_from_fn<_Fn, _As...>{__fn, {__as...}})); __sg.__dismiss(); return *std::launder(__ptr); } From fdbbabed57fbfbbc1fb0d7e1374070c9c3445367 Mon Sep 17 00:00:00 2001 From: Ahmed Hussein Date: Sun, 17 May 2026 23:05:52 +0300 Subject: [PATCH 05/11] Refactor completion function structure for improved readability and consistency --- include/stdexec/__detail/__receivers.hpp | 25 ++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/include/stdexec/__detail/__receivers.hpp b/include/stdexec/__detail/__receivers.hpp index 5887af74b..ce09cba4c 100644 --- a/include/stdexec/__detail/__receivers.hpp +++ b/include/stdexec/__detail/__receivers.hpp @@ -182,7 +182,7 @@ namespace STDEXEC && __std::constructible_from<__decay_t<_Receiver>, _Receiver>; struct _THE_RECEIVER_DOES_NOT_ACCEPT_ALL_OF_THE_SENDERS_COMPLETION_SIGNALS_ - {}; + { }; namespace __detail { @@ -237,12 +237,21 @@ namespace STDEXEC } template - constexpr auto __mk_completion_fn(_Tag, _Receiver &__rcvr) noexcept + struct __completion_fn { - return [&](_Args &&...__args) noexcept + _Receiver &__rcvr_; + + template + constexpr void operator()(_Args &&...__args) const noexcept { - _Tag()(static_cast<_Receiver &&>(__rcvr), static_cast<_Args &&>(__args)...); - }; + _Tag()(static_cast<_Receiver &&>(__rcvr_), static_cast<_Args &&>(__args)...); + } + }; + + template + constexpr auto __mk_completion_fn(_Tag, _Receiver &__rcvr) noexcept + { + return __completion_fn<_Tag, _Receiver>{__rcvr}; } // Used to test whether a sender has a nothrow connect to a receiver whose environment @@ -255,15 +264,15 @@ namespace STDEXEC template STDEXEC_ATTRIBUTE(host, device) constexpr void set_value(_Args &&...) noexcept - {} + { } template STDEXEC_ATTRIBUTE(host, device) constexpr void set_error(_Error &&) noexcept - {} + { } STDEXEC_ATTRIBUTE(host, device) - constexpr void set_stopped() noexcept {} + constexpr void set_stopped() noexcept { } }; template From 9b9157aa9c12132748384cba4d7249dfcbcab925 Mon Sep 17 00:00:00 2001 From: Ahmed Hussein Date: Sun, 17 May 2026 23:09:16 +0300 Subject: [PATCH 06/11] Refactor __mk_obj_using_alloc_fn to use a functor for improved clarity and usability --- include/stdexec/__detail/__memory.hpp | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/include/stdexec/__detail/__memory.hpp b/include/stdexec/__detail/__memory.hpp index 8f26f6841..a499fb09d 100644 --- a/include/stdexec/__detail/__memory.hpp +++ b/include/stdexec/__detail/__memory.hpp @@ -94,14 +94,24 @@ namespace STDEXEC ///////////////////////////////////////////////////////////////////////////////////////// // __allocator_aware_forward: https://eel.is/c++draft/exec#snd.expos-49 template - [[nodiscard]] - constexpr auto __mk_obj_using_alloc_fn(_Alloc const &__alloc) noexcept + struct __obj_using_alloc_fn { - return [&__alloc](_Args &&...__args) + _Alloc const &__alloc_; + + template + constexpr auto operator()([[maybe_unused]] _Args &&...__args) const { return __tuple{ - std::make_obj_using_allocator<__decay_t<_Args>>(__alloc, static_cast<_Args &&>(__args))...}; - }; + std::make_obj_using_allocator<__decay_t<_Args>>(__alloc_, + static_cast<_Args &&>(__args))...}; + } + }; + + template + [[nodiscard]] + constexpr auto __mk_obj_using_alloc_fn(_Alloc const &__alloc) noexcept + { + return __obj_using_alloc_fn<_Alloc>{__alloc}; } template From 0c0777b5146a2aab66b20bdb61a079ec29270f22 Mon Sep 17 00:00:00 2001 From: Ahmed Hussein Date: Sun, 17 May 2026 23:12:29 +0300 Subject: [PATCH 07/11] Refactor completion info handling by introducing inner and outer function structures for improved clarity and organization --- include/stdexec/__detail/__let.hpp | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/include/stdexec/__detail/__let.hpp b/include/stdexec/__detail/__let.hpp index 201c44dea..3687e351a 100644 --- a/include/stdexec/__detail/__let.hpp +++ b/include/stdexec/__detail/__let.hpp @@ -598,20 +598,31 @@ namespace STDEXEC return __transform(__signature<__msplice<_Info.__signature>>, _Info); }; - //! @tparam _Info A `__static_vector` of `__completion_info` objects representing - //! the completions of the predecessor sender. - template - static constexpr auto __get_cmpl_info_i = [](__indices<_Is...>) + template + struct __cmpl_info_inner_fn { - return [] + constexpr auto operator()() const { __static_vector<__completion_info, 0> __result; - // NB: this fold uses an overloaded addition operator that propagates - // __mexception objects when constexpr exceptions are not available. return (__maybe_transform_cmplsig<_Info[_Is]>(_Transform) + ... + __result); - }; + } }; + template + struct __cmpl_info_outer_fn + { + template + constexpr auto operator()(__indices<_Is...>) const + { + return __cmpl_info_inner_fn<_Info, _Transform, _Is...>{}; + } + }; + + //! @tparam _Info A `__static_vector` of `__completion_info` objects representing + //! the completions of the predecessor sender. + template + static constexpr auto __get_cmpl_info_i = __cmpl_info_outer_fn<_Info, _Transform>{}; + template struct __get_cmpl_info { From 6a5cf93b6a6ccbc2e5674bedf6ce0315bea985b0 Mon Sep 17 00:00:00 2001 From: Ahmed Hussein Date: Sun, 17 May 2026 23:16:05 +0300 Subject: [PATCH 08/11] Introduce __dealloc_guard for improved memory management in __emplace_into --- include/stdexec/__detail/__any.hpp | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/include/stdexec/__detail/__any.hpp b/include/stdexec/__detail/__any.hpp index af73c0d2d..b39331dbb 100644 --- a/include/stdexec/__detail/__any.hpp +++ b/include/stdexec/__detail/__any.hpp @@ -585,6 +585,27 @@ namespace STDEXEC::__any ////////////////////////////////////////////////////////////////////////////////////////// // __emplace_into + template + struct __dealloc_guard + { + _Alloc2 &__alloc; + typename std::allocator_traits<_Alloc2>::pointer __ptr; + bool __dismissed = false; + + void __dismiss() noexcept + { + __dismissed = true; + } + + ~__dealloc_guard() noexcept + { + if (!__dismissed) + { + std::allocator_traits<_Alloc2>::deallocate(__alloc, __ptr, 1); + } + } + }; + template constexpr _Model &__emplace_into([[maybe_unused]] _Allocator const &__alloc, [[maybe_unused]] __iroot *&__root_ptr, @@ -606,10 +627,10 @@ namespace STDEXEC::__any } else { - auto __alloc2 = STDEXEC::__rebind_allocator<_Model>(__alloc); - using __traits_t = std::allocator_traits; - auto *const __model = __traits_t::allocate(__alloc2, 1); - __scope_guard __guard{[&]() noexcept { __traits_t::deallocate(__alloc2, __model, 1); }}; + auto __alloc2 = STDEXEC::__rebind_allocator<_Model>(__alloc); + using __traits_t = std::allocator_traits; + auto *const __model = __traits_t::allocate(__alloc2, 1); + __dealloc_guard __guard{__alloc2, __model}; __traits_t::construct(__alloc2, __model, static_cast<_Args &&>(__args)...); __guard.__dismiss(); *__std::start_lifetime_as<__tagged_ptr>(__buff.data()) = __tagged_ptr(__model); From ecf7b1a09ef9afb7c0385e7ffb920f24e051d6e8 Mon Sep 17 00:00:00 2001 From: Ahmed Hussein Date: Sun, 17 May 2026 23:21:52 +0300 Subject: [PATCH 09/11] Introduce __connect_fn for improved operation connection handling in parallel scheduler --- .../stdexec/__detail/__parallel_scheduler.hpp | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/include/stdexec/__detail/__parallel_scheduler.hpp b/include/stdexec/__detail/__parallel_scheduler.hpp index 7a81b221a..7b81dde71 100644 --- a/include/stdexec/__detail/__parallel_scheduler.hpp +++ b/include/stdexec/__detail/__parallel_scheduler.hpp @@ -656,6 +656,19 @@ namespace STDEXEC return {__sched_}; } + template + struct __connect_fn + { + _Previous __previous; + __detail::__backend_ptr_t __sched; + + auto operator()(_Op& __op) && noexcept + { + using __receiver_t = _Op::__intermediate_receiver_t; + return STDEXEC::connect(std::move(__previous), __receiver_t{__op, std::move(__sched)}); + } + }; + /// Connects `__self` to `__rcvr`, returning the operation state containing the work to be done. template auto connect(_Rcvr __rcvr) && noexcept(__nothrow_move_constructible<_Rcvr>) @@ -664,14 +677,11 @@ namespace STDEXEC using __res_t = __detail::__system_bulk_op<_IsUnchunked, _Previous, _Size, _Fn, _Rcvr, _Parallelize>; using __receiver_t = __res_t::__intermediate_receiver_t; - return {std::move(*this), - std::move(__rcvr), - [this](auto& __op) - { - // Connect bulk input receiver with the previous operation and store in the operating state. - return STDEXEC::connect(std::move(this->__previous_), - __receiver_t{__op, std::move(this->__sched_)}); - }}; + return { + std::move(*this), + std::move(__rcvr), + __connect_fn<__res_t>{std::move(__previous_), std::move(__sched_)} + }; } /// Gets the completion signatures for this sender. From 803566f535e25dd96cfc439446f5305ee143b4c8 Mon Sep 17 00:00:00 2001 From: Eric Niebler Date: Mon, 18 May 2026 16:23:13 -0700 Subject: [PATCH 10/11] make `__dealloc_guard` member functions constexpr Co-authored-by: Eric Niebler --- include/stdexec/__detail/__any.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/stdexec/__detail/__any.hpp b/include/stdexec/__detail/__any.hpp index b39331dbb..9b36f791e 100644 --- a/include/stdexec/__detail/__any.hpp +++ b/include/stdexec/__detail/__any.hpp @@ -592,12 +592,12 @@ namespace STDEXEC::__any typename std::allocator_traits<_Alloc2>::pointer __ptr; bool __dismissed = false; - void __dismiss() noexcept + constexpr void __dismiss() noexcept { __dismissed = true; } - ~__dealloc_guard() noexcept + constexpr ~__dealloc_guard() noexcept { if (!__dismissed) { From 42df75e8d36804e4108ca54bf47d0846afcde271 Mon Sep 17 00:00:00 2001 From: Eric Niebler Date: Tue, 19 May 2026 18:07:12 -0700 Subject: [PATCH 11/11] fix formatting --- include/stdexec/__detail/__completion_info.hpp | 2 +- include/stdexec/__detail/__receivers.hpp | 8 ++++---- include/stdexec/__detail/__tuple.hpp | 2 +- include/stdexec/__detail/__variant.hpp | 6 +++--- include/stdexec/coroutine.hpp | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/include/stdexec/__detail/__completion_info.hpp b/include/stdexec/__detail/__completion_info.hpp index caf4060a2..2b4d845d8 100644 --- a/include/stdexec/__detail/__completion_info.hpp +++ b/include/stdexec/__detail/__completion_info.hpp @@ -57,7 +57,7 @@ namespace STDEXEC , __signature(__mtypeid<_Tag(_Args...)>) , __domain(__domain) , __behavior(__behavior) - { } + {} template constexpr auto __populate() noexcept -> __completion_info & diff --git a/include/stdexec/__detail/__receivers.hpp b/include/stdexec/__detail/__receivers.hpp index 399eff40a..75cc603a8 100644 --- a/include/stdexec/__detail/__receivers.hpp +++ b/include/stdexec/__detail/__receivers.hpp @@ -380,7 +380,7 @@ namespace STDEXEC && __std::constructible_from<__decay_t<_Receiver>, _Receiver>; struct _THE_RECEIVER_DOES_NOT_ACCEPT_ALL_OF_THE_SENDERS_COMPLETION_SIGNALS_ - { }; + {}; namespace __detail { @@ -484,15 +484,15 @@ namespace STDEXEC template STDEXEC_ATTRIBUTE(host, device) constexpr void set_value(_Args &&...) noexcept - { } + {} template STDEXEC_ATTRIBUTE(host, device) constexpr void set_error(_Error &&) noexcept - { } + {} STDEXEC_ATTRIBUTE(host, device) - constexpr void set_stopped() noexcept { } + constexpr void set_stopped() noexcept {} }; template diff --git a/include/stdexec/__detail/__tuple.hpp b/include/stdexec/__detail/__tuple.hpp index 65becb2ad..7d9ddcf61 100644 --- a/include/stdexec/__detail/__tuple.hpp +++ b/include/stdexec/__detail/__tuple.hpp @@ -77,7 +77,7 @@ namespace STDEXEC template struct __tuple : __tup::__tupl_base<__make_indices, _Ts...> - { }; + {}; template <> struct __tuple<> diff --git a/include/stdexec/__detail/__variant.hpp b/include/stdexec/__detail/__variant.hpp index 8b33b3c43..a772d5fe9 100644 --- a/include/stdexec/__detail/__variant.hpp +++ b/include/stdexec/__detail/__variant.hpp @@ -48,7 +48,7 @@ namespace STDEXEC #endif struct __monostate - { }; + {}; struct __visit_t { @@ -102,7 +102,7 @@ namespace STDEXEC { public: STDEXEC_ATTRIBUTE(host, device) - constexpr __variant(__no_init_t) noexcept { } + constexpr __variant(__no_init_t) noexcept {} template STDEXEC_ATTRIBUTE(host, device) @@ -169,7 +169,7 @@ namespace STDEXEC // Construct into the valueless state: STDEXEC_ATTRIBUTE(host, device) - constexpr explicit __variant(__no_init_t) noexcept { } + constexpr explicit __variant(__no_init_t) noexcept {} STDEXEC_ATTRIBUTE(host, device) constexpr __variant(__variant &&__other) noexcept(__nothrow_move_constructible<_Ts...>) diff --git a/include/stdexec/coroutine.hpp b/include/stdexec/coroutine.hpp index 9cbbde957..092d0ca5c 100644 --- a/include/stdexec/coroutine.hpp +++ b/include/stdexec/coroutine.hpp @@ -145,7 +145,7 @@ namespace STDEXEC constexpr __coroutine_handle(__std::coroutine_handle<_Promise> __coro) noexcept : __coroutine_handle<>{__coro} - { } + {} [[nodiscard]] static constexpr auto from_promise(_Promise& __promise) noexcept -> __coroutine_handle @@ -181,7 +181,7 @@ namespace STDEXEC __callback_fn_t* __resume_ = &__noop_fn; __callback_fn_t* __destroy_ = &__noop_fn; - static void __noop_fn(void*) noexcept { } + static void __noop_fn(void*) noexcept {} }; static constexpr std::ptrdiff_t __coro_promise_offset = static_cast(