1 #include <coroutine>
2 
3 struct task {
4   struct promise_type {
initial_suspendtask::promise_type5     auto initial_suspend() noexcept { return std::suspend_always{}; }
final_suspendtask::promise_type6     auto final_suspend() noexcept { return std::suspend_always{}; }
return_voidtask::promise_type7     void return_void() {}
get_return_objecttask::promise_type8     task get_return_object() { return task{}; }
unhandled_exceptiontask::promise_type9     void unhandled_exception() noexcept {}
10   };
11 
~tasktask12   ~task() noexcept {}
13 
await_readytask14   bool await_ready() const noexcept { return false; }
await_suspendtask15   void await_suspend(std::coroutine_handle<>) noexcept {}
await_resumetask16   void await_resume() noexcept {}
17 };
18 
19 struct base
20 {
21     virtual ~base() = default;
22 };
23 
24 class exception : public virtual base
25 {};
26 
27 struct factory
28 {
29     virtual ~factory() = default;
30     virtual int makeId() const;
31 };
32 
33 task g(int);
34 
f(factory & factory)35 task f(factory& factory) {
36     co_await g(factory.makeId());
37 }
38