1 // { dg-do run } 2 3 // Test co-await in while condition. 4 5 #include "../coro.h" 6 7 // boiler-plate for tests of codegen 8 #include "../coro1-ret-int-yield-int.h" 9 10 /* An awaiter that suspends always and returns an int as the 11 await_resume output. */ 12 struct IntAwaiter { 13 int v; IntAwaiterIntAwaiter14 IntAwaiter (int _v) : v(_v) {} await_readyIntAwaiter15 bool await_ready () { return false; } await_suspendIntAwaiter16 void await_suspend (coro::coroutine_handle<>) {} await_resumeIntAwaiter17 int await_resume () { return v; } 18 }; 19 20 struct coro1 coro_a(bool t)21coro_a (bool t) 22 { 23 int accum = 0; 24 for (int x = 3; x < co_await IntAwaiter (10); x++) 25 accum += x; 26 27 co_return accum; 28 } 29 30 /* An awaiter that suspends always and returns an int as the 31 await_resume output. */ 32 struct TenAwaiter { 33 int v; TenAwaiterTenAwaiter34 TenAwaiter (int _v) : v(_v) {} await_readyTenAwaiter35 bool await_ready () { return false; } await_suspendTenAwaiter36 void await_suspend (coro::coroutine_handle<>) {} await_resumeTenAwaiter37 bool await_resume () { return v < 10; } 38 }; 39 40 struct coro1 coro_b(bool t)41coro_b (bool t) 42 { 43 int accum = 0; 44 for (int x = 3; co_await TenAwaiter (x); x++) 45 accum += x; 46 47 co_return accum; 48 } 49 50 void check_a_coro(struct coro1 & x)51check_a_coro (struct coro1& x) 52 { 53 if (x.handle.done()) 54 { 55 PRINT ("check_a_coro: apparently done when we shouldn't be..."); 56 abort (); 57 } 58 59 PRINT ("check_a_coro: resume initial suspend"); 60 x.handle.resume(); 61 62 // will be false - so no yield expected. 63 PRINT ("check_a_coro: resume loops"); 64 while (!x.handle.done()) 65 x.handle.resume(); 66 67 int y = x.handle.promise().get_value(); 68 if ( y != 42 ) 69 { 70 PRINTF ("check_a_coro: apparently wrong value : %d\n", y); 71 abort (); 72 } 73 74 if (!x.handle.done()) 75 { 76 PRINT ("check_a_coro: apparently not done..."); 77 abort (); 78 } 79 } 80 main()81int main () 82 { 83 { 84 struct coro1 x = coro_a (false); 85 check_a_coro (x); 86 } 87 { 88 struct coro1 x = coro_b (false); 89 check_a_coro (x); 90 } 91 92 PRINT ("main: returning"); 93 return 0; 94 } 95