view gcc/testsuite/g++.dg/coroutines/torture/pr95003.C @ 19:2b5abeee2509 default tip

update gcc11
author anatofuz
date Mon, 25 May 2020 07:50:57 +0900
parents
children
line wrap: on
line source

// { dg-do run }

#include "../coro.h"
#include "../coro1-ret-int-yield-int.h"

// This tests that, when we insert bind scopes to contain variables that
// have been promoted from compiler temporaries to extend their lifetimes
// to a containing full expression, the inserted bind scopes have their
// tree-side-effects set.

struct Awaitable {
  int v;
  Awaitable (int _v) : v(_v) {}
  bool await_ready() { return false; }
  void await_suspend(std::coroutine_handle<coro1::promise_type>) {}
  int await_resume() { return v; }
  auto operator co_await() { return *this; }
};

coro1
my_coro
(int x)
{
  int sum = 0;
  for (unsigned i = 0; i < 100; ++i) {
    sum += co_await Awaitable{x+1};
  }
  co_return sum;
}

int main ()
{
  PRINT ("main: create coro1");
  struct coro1 f_coro = my_coro (0);

  PRINT ("main: OK -- looping");

  do {
    f_coro.handle.resume();
  } while (!f_coro.handle.done());

  int y = f_coro.handle.promise().get_value();
  if (y != 100)
    {
      PRINTF ("main: y is wrong : %d, should be 100\n", y);
      abort ();
    }
  puts ("main: done");
  return 0;
}