From 26e78220c71829523181592eb5047538a6e35a99 Mon Sep 17 00:00:00 2001 From: Iain Sandoe Date: Sun, 23 Feb 2020 15:44:20 +0000 Subject: [PATCH] coroutines: Test that we correctly use class data members. Improve test coverage, NFC. gcc/testsuite/ChangeLog: 2020-03-01 Iain Sandoe * g++.dg/coroutines/torture/class-07-data-member.C: New test. --- gcc/testsuite/ChangeLog | 4 ++ .../coroutines/torture/class-07-data-member.C | 61 ++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 gcc/testsuite/g++.dg/coroutines/torture/class-07-data-member.C diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fd3eeba..35b1a3c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2020-03-01 Iain Sandoe + + * g++.dg/coroutines/torture/class-07-data-member.C: New test. + 2020-03-01 Paul Thomas 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 index 0000000..00a0df6 --- /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; +} -- 2.7.4