Mercurial > hg > CbC > CbC_gcc
view gcc/testsuite/g++.dg/coroutines/torture/local-var-05-awaitable.C @ 152:2b5abeee2509
update gcc11
author | anatofuz |
---|---|
date | Mon, 25 May 2020 07:50:57 +0900 |
parents | |
children |
line wrap: on
line source
// { dg-do run } // Test the case where the awaitables are local vars, and therefore already // have a frame representation - and should not be copied to a second frame // entry (since elision of that copy would break the assumptions made in the // management of the lifetime of the awaitable). #include "../coro.h" #include <vector> // boiler-plate for tests of codegen #include "../coro1-ret-int-yield-int.h" /* Make a non-trivial awaitable. */ struct Awaitable { int v; std::vector<int> x; Awaitable () : v(0), x(1,0) {PRINTF ("Awaitable()\n");} Awaitable (int _v) : v(_v), x(1,_v) {PRINTF ("Awaitable(%d)\n",_v);} bool await_ready () { return false; } void await_suspend(coro::coroutine_handle<>) {} int await_resume() { return v + x[0];} ~Awaitable () {PRINTF ("~Awaitable(%d)\n",v);} }; coro1 my_coro (int start) noexcept { PRINT ("my_coro"); Awaitable aw0 = Awaitable (start); Awaitable aw1 = Awaitable (4); Awaitable aw2 = Awaitable (10); int sum; /* We are started with a suspend_always init suspend expr. */ sum = co_await aw0; PRINT ("my_coro 1"); sum += co_await aw1; PRINT ("my_coro 2"); sum += co_await aw2; PRINT ("my_coro 3"); co_return sum; } int main () { PRINT ("main: create my_coro"); struct coro1 x = my_coro (7); PRINT ("main: ramp done, resuming init suspend"); if (x.handle.done()) abort(); x.handle.resume(); // now do the three co_awaits. while(!x.handle.done()) x.handle.resume(); PRINT ("main: after resuming 3 co_awaits"); /* Now we should have the co_returned value. */ int y = x.handle.promise().get_value(); if (y != 42) { PRINTF ("main: wrong result (%d).", y); abort (); } PRINT ("main: returning"); return 0; }