Viewing file: pr95599.C (1.76 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
// { dg-do run }
// The simplest co_await we can do.
#include "coro.h"
// boiler-plate for tests of codegen #include "coro1-ret-int-yield-int.h"
int counter = 0; int a, b, c, d; int e, f, g;
struct suspend_always_order { suspend_always_order (int *v) { PRINT ("susp-always-order-ctor-value"); *v = counter++; } suspend_always_order () { PRINT ("susp-always-order-ctor"); } constexpr bool await_ready() const noexcept { return false; } void await_suspend(coro1::handle_type) const noexcept { PRINT ("susp-always-order-susp");} void await_resume() const noexcept { PRINT ("susp-always-order-resume");} ~suspend_always_order() { PRINT ("susp-always-order-dtor"); } };
coro1 my_coro () { (a = counter++, b = counter++, co_await suspend_always_order(&c), d = counter++); co_await (e = counter++, suspend_always_order (&f)); co_return (g = counter++, 10); }
int main () { auto f_coro = my_coro ();
if (f_coro.handle.done()) { PRINT ("main: we should not be 'done' [1]"); abort (); } PRINT ("main: resuming [1] initial suspend"); f_coro.handle.resume(); PRINT ("main: resuming [2] co_await"); f_coro.handle.resume(); PRINT ("main: resuming [3] co_await"); f_coro.handle.resume();
/* we should now have returned with the co_return */ if (!f_coro.handle.done()) { PRINT ("main: we should be 'done' "); abort (); } int y = f_coro.handle.promise().get_value(); if (y != 10) { PRINTF ("main: y is wrong : %d, should be 10\n", y); abort (); } if (a != 0 || b != 1 || c != 2 || d != 3 || e != 4 || f != 5 || g != 6 ) { PRINTF ("something happened in the wrong order %d, %d, %d, %d, %d, %d, %d\n", a, b, c, d, e, f, g); abort (); } puts ("main: done"); return 0; }
|