+++ /dev/null
-// { dg-do run }
-
-// Simplest local decl.
-
-#include "../coro.h"
-
-// boiler-plate for tests of codegen
-#include "../coro1-ret-int-yield-int.h"
-
-struct coro1
-f () noexcept
-{
- const int answer = 42;
- PRINTF ("coro1: about to return %d\n", answer);
- co_return answer;
-}
-
-int main ()
-{
- PRINT ("main: create coro1");
- struct coro1 x = f ();
- PRINT ("main: got coro1 - resuming");
- if (x.handle.done())
- abort();
- x.handle.resume();
- PRINT ("main: after resume");
- int y = x.handle.promise().get_value();
- if ( y != 42 )
- abort ();
- if (!x.handle.done())
- {
- PRINT ("main: apparently not done...");
- abort ();
- }
- PRINT ("main: returning");
- return 0;
-}
--- /dev/null
+// { dg-do run }
+
+// Simplest local decl.
+
+#include "../coro.h"
+
+// boiler-plate for tests of codegen
+#include "../coro1-ret-int-yield-int.h"
+
+struct coro1
+f () noexcept
+{
+ const int answer = 42;
+ PRINTF ("coro1: about to return %d\n", answer);
+ co_return answer;
+}
+
+int main ()
+{
+ PRINT ("main: create coro1");
+ struct coro1 x = f ();
+ PRINT ("main: got coro1 - resuming");
+ if (x.handle.done())
+ abort();
+ x.handle.resume();
+ PRINT ("main: after resume");
+ int y = x.handle.promise().get_value();
+ if ( y != 42 )
+ abort ();
+ if (!x.handle.done())
+ {
+ PRINT ("main: apparently not done...");
+ abort ();
+ }
+ PRINT ("main: returning");
+ return 0;
+}
--- /dev/null
+// { dg-do run }
+
+// Simplest local var
+
+#include "../coro.h"
+
+// boiler-plate for tests of codegen
+#include "../coro1-ret-int-yield-int.h"
+
+struct coro1
+f (int x) noexcept
+{
+ int answer = x + 6132;
+ PRINTF ("coro1: about to return %d\n", answer);
+ co_return answer;
+}
+
+int main ()
+{
+ PRINT ("main: create coro1");
+ struct coro1 x = f (42);
+ PRINT ("main: got coro1 - resuming");
+ if (x.handle.done())
+ abort();
+ x.handle.resume();
+ PRINT ("main: after resume");
+ int y = x.handle.promise().get_value();
+ if ( y != 6174 )
+ abort ();
+ if (!x.handle.done())
+ {
+ PRINT ("main: apparently not done...");
+ abort ();
+ }
+ PRINT ("main: returning");
+ return 0;
+}
--- /dev/null
+// { dg-do run }
+
+// Test local vars in nested scopes
+
+#include "../coro.h"
+
+// boiler-plate for tests of codegen
+#include "../coro1-ret-int-yield-int.h"
+
+struct coro1
+f (int x) noexcept
+{
+ int y = x;
+ const int test = 20;
+ if (y > test)
+ {
+ int fred = y - 20;
+ PRINTF ("coro1: about to return %d\n", fred);
+ co_return fred;
+ }
+ else
+ {
+ PRINT ("coro1: about to return the answer\n");
+ co_return y;
+ }
+
+ co_return x;
+}
+
+int main ()
+{
+ PRINT ("main: create coro1");
+ struct coro1 x = f (6194);
+ PRINT ("main: got coro1 - resuming");
+ if (x.handle.done())
+ abort();
+ x.handle.resume();
+ PRINT ("main: after resume");
+ int y = x.handle.promise().get_value();
+ if ( y != 6174 )
+ abort ();
+ if (!x.handle.done())
+ {
+ PRINT ("main: apparently not done...");
+ abort ();
+ //x.handle.resume();
+ }
+ PRINT ("main: returning");
+ return 0;
+}
--- /dev/null
+// { dg-do run }
+
+// Test modifying a local var and yielding several instances of it.
+
+#include "../coro.h"
+
+// boiler-plate for tests of codegen
+#include "../coro1-ret-int-yield-int.h"
+
+struct coro1
+f (int start) noexcept
+{
+ int value = start;
+ PRINT ("f: about to yield start");
+ co_yield start;
+
+ value -= 31;
+ PRINT ("f: about to yield (value-31)");
+ co_yield value;
+
+ value += 6163;
+ PRINT ("f: about to return (value+6163)");
+ co_return value;
+}
+
+int main ()
+{
+ PRINT ("main: create coro1");
+ struct coro1 x = f (42);
+ PRINT ("main: got coro1 - resuming (1)");
+ if (x.handle.done())
+ abort();
+ x.handle.resume();
+ PRINT ("main: after resume (1)");
+ int y = x.handle.promise().get_value();
+ if ( y != 42 )
+ abort ();
+ PRINT ("main: apparently got 42 - resuming (2)");
+ if (x.handle.done())
+ abort();
+ x.handle.resume();
+ PRINT ("main: after resume (2)");
+ y = x.handle.promise().get_value();
+ if ( y != 11 )
+ abort ();
+ PRINT ("main: apparently got 11 - resuming (3)");
+ if (x.handle.done())
+ {
+ PRINT ("main: done?");
+ abort();
+ }
+ x.handle.resume();
+ PRINT ("main: after resume (2) checking return");
+ y = x.handle.promise().get_value();
+ if ( y != 6174 )
+ abort ();
+ PRINT ("main: apparently got 6174");
+ if (!x.handle.done())
+ {
+ PRINT ("main: apparently not done...");
+ abort ();
+ }
+ PRINT ("main: returning");
+ return 0;
+}
--- /dev/null
+// { dg-do run }
+
+// Test modifying a local var across nested scopes containing vars
+// hiding those at outer scopes.
+
+#include "../coro.h"
+
+// boiler-plate for tests of codegen
+#include "../coro1-ret-int-yield-int.h"
+
+struct coro1
+f (int start) noexcept
+{
+ int value = start;
+ {
+ int value = start + 5;
+ {
+ int value = start + 20;
+ }
+ {
+ int value = start + 1;
+ PRINT ("f: about to yield start");
+ co_yield value;
+ }
+ }
+
+ value -= 31;
+ PRINT ("f: about to yield (value-31)");
+ co_yield value;
+
+ value += 6163;
+ PRINT ("f: about to return (value+6163)");
+ co_return value;
+}
+
+int main ()
+{
+ PRINT ("main: create coro1");
+ struct coro1 x = f (42);
+ PRINT ("main: got coro1 - resuming (1)");
+ if (x.handle.done())
+ abort();
+ x.handle.resume();
+ PRINT ("main: after resume (1)");
+ int y = x.handle.promise().get_value();
+ if ( y != 43 )
+ abort ();
+ PRINT ("main: apparently got 42 - resuming (2)");
+ if (x.handle.done())
+ abort();
+ x.handle.resume();
+ PRINT ("main: after resume (2)");
+ y = x.handle.promise().get_value();
+ if ( y != 11 )
+ abort ();
+ PRINT ("main: apparently got 11 - resuming (3)");
+ if (x.handle.done())
+ {
+ PRINT ("main: done?");
+ abort();
+ }
+ x.handle.resume();
+ PRINT ("main: after resume (2) checking return");
+ y = x.handle.promise().get_value();
+ if ( y != 6174 )
+ abort ();
+ PRINT ("main: apparently got 6174");
+ if (!x.handle.done())
+ {
+ PRINT ("main: apparently not done...");
+ abort ();
+ }
+ PRINT ("main: returning");
+ return 0;
+}
--- /dev/null
+// { 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;
+}
+++ /dev/null
-// { dg-do run }
-
-// Simplest local var
-
-#include "../coro.h"
-
-// boiler-plate for tests of codegen
-#include "../coro1-ret-int-yield-int.h"
-
-struct coro1
-f (int x) noexcept
-{
- int answer = x + 6132;
- PRINTF ("coro1: about to return %d\n", answer);
- co_return answer;
-}
-
-int main ()
-{
- PRINT ("main: create coro1");
- struct coro1 x = f (42);
- PRINT ("main: got coro1 - resuming");
- if (x.handle.done())
- abort();
- x.handle.resume();
- PRINT ("main: after resume");
- int y = x.handle.promise().get_value();
- if ( y != 6174 )
- abort ();
- if (!x.handle.done())
- {
- PRINT ("main: apparently not done...");
- abort ();
- }
- PRINT ("main: returning");
- return 0;
-}
+++ /dev/null
-// { dg-do run }
-
-// Test local vars in nested scopes
-
-#include "../coro.h"
-
-// boiler-plate for tests of codegen
-#include "../coro1-ret-int-yield-int.h"
-
-struct coro1
-f (int x) noexcept
-{
- int y = x;
- const int test = 20;
- if (y > test)
- {
- int fred = y - 20;
- PRINTF ("coro1: about to return %d\n", fred);
- co_return fred;
- }
- else
- {
- PRINT ("coro1: about to return the answer\n");
- co_return y;
- }
-
- co_return x;
-}
-
-int main ()
-{
- PRINT ("main: create coro1");
- struct coro1 x = f (6194);
- PRINT ("main: got coro1 - resuming");
- if (x.handle.done())
- abort();
- x.handle.resume();
- PRINT ("main: after resume");
- int y = x.handle.promise().get_value();
- if ( y != 6174 )
- abort ();
- if (!x.handle.done())
- {
- PRINT ("main: apparently not done...");
- abort ();
- //x.handle.resume();
- }
- PRINT ("main: returning");
- return 0;
-}
+++ /dev/null
-// { dg-do run }
-
-// Test modifying a local var and yielding several instances of it.
-
-#include "../coro.h"
-
-// boiler-plate for tests of codegen
-#include "../coro1-ret-int-yield-int.h"
-
-struct coro1
-f (int start) noexcept
-{
- int value = start;
- PRINT ("f: about to yield start");
- co_yield start;
-
- value -= 31;
- PRINT ("f: about to yield (value-31)");
- co_yield value;
-
- value += 6163;
- PRINT ("f: about to return (value+6163)");
- co_return value;
-}
-
-int main ()
-{
- PRINT ("main: create coro1");
- struct coro1 x = f (42);
- PRINT ("main: got coro1 - resuming (1)");
- if (x.handle.done())
- abort();
- x.handle.resume();
- PRINT ("main: after resume (1)");
- int y = x.handle.promise().get_value();
- if ( y != 42 )
- abort ();
- PRINT ("main: apparently got 42 - resuming (2)");
- if (x.handle.done())
- abort();
- x.handle.resume();
- PRINT ("main: after resume (2)");
- y = x.handle.promise().get_value();
- if ( y != 11 )
- abort ();
- PRINT ("main: apparently got 11 - resuming (3)");
- if (x.handle.done())
- {
- PRINT ("main: done?");
- abort();
- }
- x.handle.resume();
- PRINT ("main: after resume (2) checking return");
- y = x.handle.promise().get_value();
- if ( y != 6174 )
- abort ();
- PRINT ("main: apparently got 6174");
- if (!x.handle.done())
- {
- PRINT ("main: apparently not done...");
- abort ();
- }
- PRINT ("main: returning");
- return 0;
-}
+++ /dev/null
-// { dg-do run }
-
-// Test modifying a local var across nested scopes containing vars
-// hiding those at outer scopes.
-
-#include "../coro.h"
-
-// boiler-plate for tests of codegen
-#include "../coro1-ret-int-yield-int.h"
-
-struct coro1
-f (int start) noexcept
-{
- int value = start;
- {
- int value = start + 5;
- {
- int value = start + 20;
- }
- {
- int value = start + 1;
- PRINT ("f: about to yield start");
- co_yield value;
- }
- }
-
- value -= 31;
- PRINT ("f: about to yield (value-31)");
- co_yield value;
-
- value += 6163;
- PRINT ("f: about to return (value+6163)");
- co_return value;
-}
-
-int main ()
-{
- PRINT ("main: create coro1");
- struct coro1 x = f (42);
- PRINT ("main: got coro1 - resuming (1)");
- if (x.handle.done())
- abort();
- x.handle.resume();
- PRINT ("main: after resume (1)");
- int y = x.handle.promise().get_value();
- if ( y != 43 )
- abort ();
- PRINT ("main: apparently got 42 - resuming (2)");
- if (x.handle.done())
- abort();
- x.handle.resume();
- PRINT ("main: after resume (2)");
- y = x.handle.promise().get_value();
- if ( y != 11 )
- abort ();
- PRINT ("main: apparently got 11 - resuming (3)");
- if (x.handle.done())
- {
- PRINT ("main: done?");
- abort();
- }
- x.handle.resume();
- PRINT ("main: after resume (2) checking return");
- y = x.handle.promise().get_value();
- if ( y != 6174 )
- abort ();
- PRINT ("main: apparently got 6174");
- if (!x.handle.done())
- {
- PRINT ("main: apparently not done...");
- abort ();
- }
- PRINT ("main: returning");
- return 0;
-}
+++ /dev/null
-// { 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;
-}