coroutines: Test that we correctly use class data members.
authorIain Sandoe <iain@sandoe.co.uk>
Sun, 23 Feb 2020 15:44:20 +0000 (15:44 +0000)
committerIain Sandoe <iain@sandoe.co.uk>
Sun, 1 Mar 2020 17:18:45 +0000 (17:18 +0000)
Improve test coverage, NFC.

gcc/testsuite/ChangeLog:

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

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

gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/coroutines/torture/class-07-data-member.C [new file with mode: 0644]

index fd3eeba994610dd0e6a5db47ff38c30fea6544c2..35b1a3c2bfcaaff1ba2e49c0a9b26ec113e9298d 100644 (file)
@@ -1,3 +1,7 @@
+2020-03-01 Iain Sandoe <iain@sandoe.co.uk>
+
+       * g++.dg/coroutines/torture/class-07-data-member.C: New test.
+
 2020-03-01  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/92976
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 (file)
index 0000000..00a0df6
--- /dev/null
@@ -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;
+}