1 // { dg-do run } 2 3 // GRO differs from the eventual return type. 4 5 # include "../coro.h" 6 7 struct coro1 { 8 struct promise_type; 9 using handle_type = coro::coroutine_handle<coro1::promise_type>; 10 handle_type handle; coro1coro111 coro1 () : handle(0) {} coro1coro112 coro1 (handle_type _handle) 13 : handle(_handle) { 14 PRINT("Created coro1 object from handle"); 15 } 16 coro1 (const coro1 &) = delete; // no copying coro1coro117 coro1 (coro1 &&s) : handle(s.handle) { 18 s.handle = nullptr; 19 PRINT("coro1 mv ctor "); 20 } 21 coro1 &operator = (coro1 &&s) { 22 handle = s.handle; 23 s.handle = nullptr; 24 PRINT("coro1 op= "); 25 return *this; 26 } ~coro1coro127 ~coro1() { 28 PRINT("Destroyed coro1"); 29 if ( handle ) 30 handle.destroy(); 31 } 32 33 struct suspend_never_prt { await_readycoro1::suspend_never_prt34 bool await_ready() const noexcept { return true; } await_suspendcoro1::suspend_never_prt35 void await_suspend(handle_type) const noexcept { PRINT ("susp-never-susp");} await_resumecoro1::suspend_never_prt36 void await_resume() const noexcept { PRINT ("susp-never-resume");} ~suspend_never_prtcoro1::suspend_never_prt37 ~suspend_never_prt() {}; 38 }; 39 40 struct suspend_always_prt { await_readycoro1::suspend_always_prt41 bool await_ready() const noexcept { return false; } await_suspendcoro1::suspend_always_prt42 void await_suspend(handle_type) const noexcept { PRINT ("susp-always-susp");} await_resumecoro1::suspend_always_prt43 void await_resume() const noexcept { PRINT ("susp-always-resume");} 44 }; 45 46 struct promise_type { promise_typecoro1::promise_type47 promise_type() { PRINT ("Created Promise"); } ~promise_typecoro1::promise_type48 ~promise_type() { PRINT ("Destroyed Promise"); } 49 get_return_objectcoro1::promise_type50 auto get_return_object () { 51 PRINT ("get_return_object: handle from promise"); 52 return handle_type::from_promise (*this); 53 } initial_suspendcoro1::promise_type54 auto initial_suspend () { 55 PRINT ("get initial_suspend (always)"); 56 return suspend_always_prt{}; 57 } final_suspendcoro1::promise_type58 auto final_suspend () noexcept { 59 PRINT ("get final_suspend (always)"); 60 return suspend_always_prt{}; 61 } return_voidcoro1::promise_type62 void return_void () { 63 PRINT ("return_void ()"); 64 } unhandled_exceptioncoro1::promise_type65 void unhandled_exception() { PRINT ("** unhandled exception"); } 66 }; 67 }; 68 69 struct coro1 f()70f () noexcept 71 { 72 PRINT ("coro1: about to return"); 73 co_return; 74 } 75 main()76int main () 77 { 78 PRINT ("main: create coro1"); 79 struct coro1 x = f (); 80 PRINT ("main: got coro1 - resuming"); 81 if (x.handle.done()) 82 abort(); 83 x.handle.resume(); 84 PRINT ("main: after resume"); 85 if (!x.handle.done()) 86 { 87 PRINT ("main: apparently not done..."); 88 abort (); 89 } 90 PRINT ("main: returning"); 91 return 0; 92 } 93