// { dg-additional-options "-std=c++20 -fpreprocessed -w" } namespace std { inline namespace { template struct coroutine_traits { using promise_type = _Result::promise_type; }; template struct coroutine_handle; template <> struct coroutine_handle<> { public: }; template struct coroutine_handle : coroutine_handle<> {}; struct suspend_always { bool await_ready(); void await_suspend(coroutine_handle<>); void await_resume(); }; } // namespace } // namespace std namespace coro = std; namespace cppcoro { class task { private: struct awaitable_base { coro::coroutine_handle<> m_coroutine; bool await_ready() const noexcept; void await_suspend(coro::coroutine_handle<> awaitingCoroutine) noexcept; }; public: auto operator co_await() const &noexcept { struct awaitable : awaitable_base { decltype(auto) await_resume() {} }; return awaitable{m_coroutine}; } private: coro::coroutine_handle<> m_coroutine; }; class shared_task; class shared_task_promise_base { struct final_awaiter { bool await_ready() const noexcept; template void await_suspend(coro::coroutine_handle h) noexcept; void await_resume() noexcept; }; public: coro::suspend_always initial_suspend() noexcept; final_awaiter final_suspend() noexcept; void unhandled_exception() noexcept; }; class shared_task_promise : public shared_task_promise_base { public: shared_task get_return_object() noexcept; void return_void() noexcept; }; class shared_task { public: using promise_type = shared_task_promise; }; auto make_shared_task(cppcoro::task awaitable) -> shared_task { co_return co_await static_cast(awaitable); } } // namespace cppcoro