//  { 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;
}
