1 // { dg-do run } 2 3 // Test of forwarding a templated awaitable to co_await. 4 5 #include "../coro.h" 6 7 // boiler-plate for tests of codegen 8 #include "../coro1-ret-int-yield-int.h" 9 10 /* Valued with an await_transform. */ 11 12 template< typename AWAITABLE > 13 coro1 test_fwd(AWAITABLE && awaitable)14test_fwd (AWAITABLE&& awaitable) 15 { 16 // the await_resume() just returns the saved int value. 17 int a = co_await std::forward<AWAITABLE>(awaitable); 18 // Which we co-return to the promise so that it can be 19 // retrieved. 20 co_return a; 21 } 22 main()23int main () 24 { 25 // We have an awaitable that stores the int it was constructed with. 26 coro1::suspend_always_intprt g(15); 27 struct coro1 g_coro = test_fwd (g); 28 29 PRINT ("main: resuming g [1] (initial suspend)"); 30 g_coro.handle.resume(); 31 32 PRINT ("main: resuming g [2] co_await"); 33 g_coro.handle.resume(); 34 35 int y = g_coro.handle.promise().get_value(); 36 if (y != 15) 37 { 38 PRINTF ("main: y is wrong : %d, should be 15\n", y); 39 abort (); 40 } 41 puts ("main: done"); 42 return 0; 43 } 44