Mercurial > hg > CbC > CbC_gcc
diff gcc/testsuite/g++.dg/coroutines/torture/func-params-08.C @ 152:2b5abeee2509
update gcc11
author | anatofuz |
---|---|
date | Mon, 25 May 2020 07:50:57 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gcc/testsuite/g++.dg/coroutines/torture/func-params-08.C Mon May 25 07:50:57 2020 +0900 @@ -0,0 +1,112 @@ +// { dg-do run } + +// Check that we correctly handle params with non-trivial DTORs and +// use the correct copy/move CTORs. + +#include "../coro.h" +#include <vector> + +// boiler-plate for tests of codegen +#include "../coro1-ret-int-yield-int.h" + +int regular = 0; +int copy = 0; +int move = 0; + +struct Foo { + Foo(int _v) : value(_v), x(1, _v) + { + regular++; + PRINTF ("FOO(%d)\n",_v); + } + + Foo(const Foo& t) + { + value = t.value; + x = t.x; + copy++; + PRINTF ("FOO(&), %d\n",value); + } + + Foo(Foo&& s) + { + value = s.value; + s.value = -1; + x = std::move(s.x); + s.x = std::vector<int> (); + move++; + PRINTF ("FOO(&&), %d\n", value); + } + + ~Foo() {PRINTF ("~FOO(), %d\n", value);} + + auto operator co_await() + { + struct awaitable + { + int v; + awaitable (int _v) : v(_v) {} + bool await_ready() { return false; } + void await_suspend(coro::coroutine_handle<>) {} + int await_resume() { return v;} + }; + return awaitable{value + x[0]}; + }; + + void return_value(int _v) { value = _v;} + + int value; + std::vector<int> x; +}; + +coro1 +my_coro (Foo t_lv, Foo& t_ref, Foo&& t_rv_ref) +{ + PRINT ("my_coro"); + // We are created suspended, so correct operation depends on + // the parms being copied. + int sum = co_await t_lv; + PRINT ("my_coro 1"); + sum += co_await t_ref; + PRINT ("my_coro 2"); + sum += co_await t_rv_ref; + PRINT ("my_coro 3"); + co_return sum; +} + +int main () +{ + + PRINT ("main: create coro1"); + Foo thing (4); + coro1 x = my_coro (Foo (1), thing, Foo (2)); + PRINT ("main: done ramp"); + + if (x.handle.done()) + abort(); + x.handle.resume(); + PRINT ("main: after resume (initial suspend)"); + + // 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 != 14) + { + PRINTF ("main: wrong result (%d).", y); + abort (); + } + + if (regular != 3 || copy != 1 || move != 1) + { + PRINTF ("main: unexpected ctor use (R:%d, C:%d, M:%d)\n", + regular, copy, move); + abort (); + } + + PRINT ("main: returning"); + return 0; +}