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()48 task f() {
49   co_return;
50 }
51