blob: 80e7273f1789989f2651be1bd2abb591f88b5a03 [file] [log] [blame]
// { dg-additional-options "-std=c++20 -fpreprocessed -w" }
namespace std {
inline namespace {
template <typename _Result, typename> struct coroutine_traits {
using promise_type = _Result::promise_type;
};
template <typename = void> struct coroutine_handle;
template <> struct coroutine_handle<> { public: };
template <typename> 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 <typename PROMISE>
void await_suspend(coro::coroutine_handle<PROMISE> 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<cppcoro::task &&>(awaitable);
}
} // namespace cppcoro