This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of Resolved status.

### 3469. Precondition of `coroutine_handle::promise` may be insufficient

Section: 17.12.4.7 [coroutine.handle.promise] Status: Resolved Submitter: Jiang An Opened: 2020-07-25 Last modified: 2020-11-09

Priority: 2

View all issues with Resolved status.

Discussion:

The issue is related to LWG 3460.

Because the `coroutine_handle<>` base subobject of a `coroutine_handle<P1>` can be assigned from the one of a `coroutine_handle<P2>`, a `coroutine_handle<P1>` may refer to a coroutine whose promise type is `P2`. If a `coroutine_handle<P>` refers to a coroutine with difference, a call to `promise()` should result in undefined behavior IMO.

I think that 17.12.4.7 [coroutine.handle.promise]/1 should be changed to: "Preconditions: `*this` refers to a coroutine whose promise type is `Promise`.", and the same precondition should be added to 17.12.5.2.4 [coroutine.handle.noop.promise], and hence `noexcept` should be removed from `coroutine_handle<noop_coroutine_promise>::promise`.

[2020-08-21; Reflector prioritization]

Set priority to 2 after reflector discussions.

Previous resolution [SUPERSEDED]:

> This wording is relative to N4861.

> 1. Modify 17.12.4.7 [coroutine.handle.promise] as indicated:

>    >     Promise& promise() const;

>    > > -1- Preconditions: `*this` refers to a coroutine whose promise type is `Promise`.

>    > > -2- Returns: A reference to the promise of the coroutine.

> 2. Modify 17.12.5.2 [coroutine.handle.noop], class `coroutine_handle<noop_coroutine_promise>` synopsis, as indicated:

>    >     […]
>    >     // 17.12.5.2.4 [coroutine.handle.noop.promise], promise access
>    >     noop_coroutine_promise& promise() const noexcept;
>    >     […]

> 3. Modify 17.12.5.2.4 [coroutine.handle.noop.promise] as indicated:

>    >     noop_coroutine_promise& promise() const noexcept;

>    > > -?- Preconditions: `*this` refers to a coroutine whose promise type is `noop_coroutine_promise`.

>    > > -1- Returns: A reference to the promise object associated with this coroutine handle.

[2020-11-09 Resolved by acceptance of 3460. Status changed: Tentatively Resolved → Resolved.]

Proposed resolution:

This issue is resolved by the resolution of issue 3460.