[committed] coroutines: Test that we correctly use class data members.

Message ID 34D6D1D8-22EB-43A7-A64C-F1D233B60987@sandoe.co.uk
State New
Headers show
Series
  • [committed] coroutines: Test that we correctly use class data members.
Related show

Commit Message

Iain Sandoe March 1, 2020, 5:21 p.m.
Hi,

No code changes, just improve test coverage.

tested on x86_64 darwin and linux
applied to mainline.
thanks
Iain

gcc/testsuite/ChangeLog:

2020-03-01 Iain Sandoe <iain@sandoe.co.uk>

	* g++.dg/coroutines/torture/class-07-data-member.C: New test.

Patch

diff --git a/gcc/testsuite/g++.dg/coroutines/torture/class-07-data-member.C b/gcc/testsuite/g++.dg/coroutines/torture/class-07-data-member.C
new file mode 100644
index 00000000000..00a0df69758
--- /dev/null
+++ b/gcc/testsuite/g++.dg/coroutines/torture/class-07-data-member.C
@@ -0,0 +1,61 @@ 
+//  { dg-do run }
+
+// Show that we are correctly accessing class variables.
+
+#include "../coro.h"
+
+// boiler-plate for tests of codegen
+#include "../coro1-ret-int-yield-int.h"
+
+class Foo
+{
+  int v;
+  public:
+  Foo () : v(0) {};
+  Foo (int x) : v(x) {};
+  coro1 meth ()
+    {
+      PRINT ("coro1: about to return");
+      co_return v++;
+    }
+};
+
+int main ()
+{
+  Foo inst (42);
+  int y;
+  {
+    PRINT ("main: create coro1 [instance 1]");
+    coro1 x = inst.meth ();
+    if (x.handle.done())
+      abort();
+    PRINT ("main: got coro1 - resuming (initial suspend)");
+    x.handle.resume();
+    PRINT ("main: after resume");
+    y = x.handle.promise().get_value();
+    if ( y != 42 )
+      abort ();
+    if (!x.handle.done())
+      {
+        PRINT ("main: apparently not done...");
+        abort ();
+      }
+  }
+  PRINT ("main: create coro1 [instance 2]");
+  coro1 p = inst.meth ();
+  if (p.handle.done())
+    abort();
+  PRINT ("main: got coro1 - resuming (initial suspend)");
+  p.handle.resume();
+  PRINT ("main: after resume");
+  y = p.handle.promise().get_value();
+  if ( y != 43 )
+    abort ();
+  if (!p.handle.done())
+    {
+      PRINT ("main: apparently not done...");
+      abort ();
+    }
+  PRINT ("main: returning");
+  return 0;
+}