https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110872
Bug ID: 110872 Summary: coroutine postcondition is not evaluated Product: gcc Version: 14.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: akrzemi1 at gmail dot com Target Milestone: --- Created attachment 55673 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=55673&action=edit demo program A postconditon declared on a coroutine should be evaluated when the coroutine is invoked and returns to the caller. But it isn't as per the following Compiler Explorer link. https://godbolt.org/z/48fh3f34j The expectation is enforced by the fact that the compiler allows mentioning the return type of the coroutine declaration: ``` template <typename T> struct generator { // ... bool is_valid() { return false; } }; generator<int> val(int v) [[post g: g.is_valid()]] { co_yield v; } ``` Generally, I would expect that preconditions and postconditions on coroutines should work the same as if the call to the coroutine was wrapped in a forwarding function containing the preconditions and postconditions: ``` awaitable<int> f1(int i) // coroutine [[pre: p(i)]] [[post r: q(r)]]; awaitable<int> f2(int i); // coroutine awaitable<int> ff2(int i) [[pre: p(i)]] [[post r: q(r)]]; { return f2(i); } void caller() { f1(1); // these two calls should have analogous ff2(1); // precondition and postcondition semantics } ```