| #include <coroutine> |
| #include <string> |
| |
| template<typename T> |
| struct Awaiter |
| { |
| bool await_ready() const { return false; } |
| void await_suspend(std::coroutine_handle<>) const {} |
| T await_resume() const { return T{}; } |
| }; |
| |
| struct ReturnObject |
| { |
| struct promise_type |
| { |
| ReturnObject get_return_object() { return {}; } |
| std::suspend_never initial_suspend() noexcept { return {}; } |
| std::suspend_never final_suspend() noexcept { return {}; } |
| void return_void() {} |
| void unhandled_exception() {} |
| }; |
| }; |
| |
| ReturnObject f() |
| { |
| auto a1 = Awaiter<int>{}; |
| auto a2 = Awaiter<std::string>{}; |
| |
| [[maybe_unused]] auto v1 = co_await a1; // ok |
| [[maybe_unused]] std::string v2 = co_await a2; // error |
| } |