1 // { dg-additional-options "-fsyntax-only -fno-exceptions" } 2 3 #if __has_include(<coroutine>) 4 #include <coroutine> 5 #else 6 #include <experimental/coroutine> 7 namespace std { 8 using namespace std::experimental; 9 } 10 #endif 11 12 class promise; 13 14 struct finalSuspendAwaiter { 15 int x; finalSuspendAwaiterfinalSuspendAwaiter16 finalSuspendAwaiter () : x(0) { } finalSuspendAwaiterfinalSuspendAwaiter17 finalSuspendAwaiter (int _x) : x(_x) { } noexceptfinalSuspendAwaiter18 ~finalSuspendAwaiter() noexcept(true) { } await_readyfinalSuspendAwaiter19 bool await_ready() const noexcept(true) { return false; } await_suspendfinalSuspendAwaiter20 void await_suspend(std::coroutine_handle<>) const noexcept(true) { } await_resumefinalSuspendAwaiter21 int await_resume() const noexcept(true) { return x; } 22 }; 23 24 struct finalSuspendObj { 25 int x; finalSuspendObjfinalSuspendObj26 finalSuspendObj () : x(0) { } finalSuspendObjfinalSuspendObj27 finalSuspendObj (int _x) : x(_x) { } noexceptfinalSuspendObj28 ~finalSuspendObj () noexcept(true) {} 29 co_awaitfinalSuspendObj30 finalSuspendAwaiter operator co_await() const & noexcept(true) { 31 return {x}; 32 } 33 }; 34 35 struct task { 36 struct promise_type { get_return_objecttask::promise_type37 task get_return_object() noexcept { return {}; } initial_suspendtask::promise_type38 std::suspend_never initial_suspend() noexcept { return {}; } 39 final_suspendtask::promise_type40 finalSuspendObj final_suspend() { return {3}; } // NOTE: not declared noexcept 41 return_voidtask::promise_type42 void return_void() noexcept {} unhandled_exceptiontask::promise_type43 void unhandled_exception() noexcept {} 44 }; 45 }; 46 47 // OK when exceptions are disabled f()48task f() { 49 co_return; 50 } 51