GET-AWAITER(c)
be
+ expression-equivalent to GET-AWAITER(c, q)
where `q` is
+ an lvalue of an unspecified empty class type `none-such` that lacks
+ an `await_transform` member, and where
+ coroutine_handle<none-such>
behaves as
+ `coroutine_handleawait-result-type<C, Promise>
- denotes the type decltype(GET-AWAITER(c, p).await_resume())
.
+ denotes the type decltype(GET-AWAITER(c, p).await_resume())
,
+ and await-result-type<C>
denotes the type
+ decltype(GET-AWAITER(c).await_resume())
.
5. Let `with-await-transform` be the exposition-only class template:
@@ -7098,30 +7108,64 @@ namespace std::execution {
### `execution::get_completion_signatures` [exec.getcomplsigs] ### {#spec-execution.getcomplsigs}
-1. `get_completion_signatures` is a customization point object. Let `sndr` be an
- expression such that `decltype((sndr))` is `Sndr`, and let `env` be an
- expression such that `decltype((env))` is `Env`. Then
- `get_completion_signatures(sndr, env)` is expression-equivalent to:
+1. `get_completion_signatures` is a customization point object. For a
+ subexpression `sndr`, let `Sndr` be `decltype((sndr))`. Then
+ `get_completion_signatures(sndr)` is expression-equivalent to:
- 1. `decltype(sndr.get_completion_signatures(env)){}` if that
- expression is well-formed,
+ 1. `remove_cvref_tis-awaitable<Sndr, env-promise<Env>>
+ 3. Otherwise, if is-awaitable<Sndr>
is `true`, then:
- - completion_signatures< - SET-VALUE-SIG(await-result-type<Sndr, - env-promise<Env>>), // see [exec.snd.concepts] - set_error_t(exception_ptr), - set_stopped_t()>{} -+
+ completion_signatures< + SET-VALUE-SIG(await-result-type<Sndr>), // see [exec.snd.concepts] + set_error_t(exception_ptr), + set_stopped_t()>() ++ + 4. Otherwise, `get_completion_signatures(sndr)` is ill-formed. + +2. For a subexpression `env`, let `Env` be `decltype((env))`. Then + `get_completion_signatures(sndr, env)` is expression-equivalent to: + + 1. `remove_cvref_t
is-awaitable<Sndr,
+ env-promise<Env>>
is `true`, then:
+
+ + completion_signatures< + SET-VALUE-SIG(await-result-type<Sndr, + env-promise<Env>>), // see [exec.snd.concepts] + set_error_t(exception_ptr), + set_stopped_t()>() +4. Otherwise, `get_completion_signatures(sndr, env)` is ill-formed. -2. Let `rcvr` be an rvalue receiver of type `Rcvr`, and let `Sndr` be the type of a +3. If `get_completion_signatures(sndr)` is well-formed and its type denotes a + specialization of the `completion_signatures` class template, then `Sndr` is + a non-dependent sender type ([async.ops]). + +4. Given a pack of subexpressions `se`, the expression + `get_completion_signatures(se...)` is ill-formed if `sizeof...(se)` is less + than `1` or greater than `2`. + +5. If `completion_signatures_of_t
then-cpo(sndr, f)
is ill-formed.
-3. Otherwise, the expression then-cpo(sndr, f)
is
+3. Let `invoke-result` be an alias template such that
+ invoke-result<Ts...>
denotes the type
+ `invoke_result_tgather-signatures<tag_t<set-cpo>,
+ completion_signatures_of_t<Sndr>, invoke-result,
+ type-list>
is ill-formed, the program is ill-formed.
+
+4. Otherwise, the expression then-cpo(sndr, f)
is
expression-equivalent to:
@@ -7737,10 +7794,8 @@ namespace std::execution { make-sender(then-cpo, f, sndr));-4. For `then`, `upon_error`, and `upon_stopped`, let `set-cpo` - be `set_value`, `set_error`, and `set_stopped` respectively. The - exposition-only class template `impls-for` - ([exec.snd.general]) is specialized for `then-cpo` as follows: +5. The exposition-only class template `impls-for` ([exec.snd.general]) is + specialized for `then-cpo` as follows:
namespace std::execution { @@ -7806,9 +7861,15 @@ namespace std::execution { make-sender(let-cpo, f, sndr));-5. The exposition-only class template `impls-for` - ([exec.snd.general]) is specialized for `let-cpo` as - follows: +5. Let `invoke-result` be an alias template such that +
invoke-result<Ts...>
denotes the type
+ `invoke_result_tgather-signatures<tag_t<set-cpo>,
+ completion_signatures_of_t<Sndr>, invoke-result,
+ type-list>
is ill-formed, the program is ill-formed.
+
+6. The exposition-only class template `impls-for` ([exec.snd.general]) is
+ specialized for `let-cpo` as follows:
namespace std::execution { @@ -7917,7 +7978,7 @@ namespace std::execution { env) is ill-formed. Otherwise, it is equal to-4. The exposition-only class template `impls-for` - ([exec.snd.general]) is specialized for `bulk_t` as follows: +4. Let `invoke-result` be an alias template such that +JOIN-ENV(let-env(sndr), FWD-ENV(env))
. -7. Let the subexpression `out_sndr` denote the result of the invocation +8. Let the subexpression `out_sndr` denote the result of the invocationlet-cpo(sndr, f)
or an object copied or moved from such, and let the subexpression `rcvr` denote a receiver such that the expression `connect(out_sndr, rcvr)` is well-formed. The expression `connect(out_sndr, @@ -7952,8 +8013,15 @@ namespace std::execution { make-sender(bulk, product-type{shape, f}, sndr));
invoke-result<Ts...>
denotes the type
+ `invoke_result_tgather-signatures<tag_t<set-cpo>,
+ completion_signatures_of_t<Sndr>, invoke-result,
+ type-list>
is ill-formed, the program is ill-formed.
+
+5. The exposition-only class template `impls-for` ([exec.snd.general]) is
+ specialized for `bulk_t` as follows:
namespace std::execution {
@@ -7989,7 +8057,7 @@ namespace std::execution {
`true` if and only if `Tag` denotes a type other than `set_value_t`
or if the expression `f(auto(shape), args...)` is well-formed.
-5. Let the subexpression `out_sndr` denote the result of the invocation
+6. Let the subexpression `out_sndr` denote the result of the invocation
bulk(sndr, shape, f)
or an object copied or moved from such,
and let the subexpression `rcvr` denote a receiver such that the expression
`connect(out_sndr, rcvr)` is well-formed. The expression `connect(out_sndr,