| // { dg-additional-options "-fsyntax-only" } |
| |
| #if __has_include(<coroutine>) |
| #include <coroutine> |
| #else |
| #include <experimental/coroutine> |
| namespace std { |
| using namespace std::experimental; |
| } |
| #endif |
| |
| class promise; |
| |
| struct finalSuspendAwaiter { |
| int x; |
| finalSuspendAwaiter () : x(0) { } |
| finalSuspendAwaiter (int _x) : x(_x) { } |
| ~finalSuspendAwaiter() noexcept(true) { } |
| bool await_ready() const noexcept(true) { return false; } |
| void await_suspend(std::coroutine_handle<>) const noexcept(true) { } |
| int await_resume() const noexcept(true) { return x; } |
| }; |
| |
| struct finalSuspendObj { |
| int x; |
| finalSuspendObj () : x(0) { } |
| finalSuspendObj (int _x) : x(_x) { } |
| ~finalSuspendObj () noexcept(true) {} |
| |
| finalSuspendAwaiter operator co_await() const & noexcept(true) { |
| return {x}; |
| } |
| }; |
| |
| struct task { |
| struct promise_type { |
| task get_return_object() noexcept { return {}; } |
| std::suspend_never initial_suspend() noexcept { return {}; } |
| |
| finalSuspendObj final_suspend() { return {3}; } // NOTE: not declared noexcept |
| // { dg-error {the expression 'task::promise_type::final_suspend' is required to be non-throwing} "" { target *-*-* } .-1 } |
| |
| void return_void() noexcept {} |
| void unhandled_exception() noexcept {} |
| }; |
| }; |
| |
| // This should be ill-formed since final_suspend() is potentially throwing. |
| task f() { |
| co_return; |
| } |