[pushed] coroutines, testsuite: Fix co-ret-17-void-ret-coro.C.

Message ID 5014E56D-DA6A-4298-958D-F319BEC4642A@sandoe.co.uk
State New
Headers show
Series
  • [pushed] coroutines, testsuite: Fix co-ret-17-void-ret-coro.C.
Related show

Commit Message

Iain Sandoe May 26, 2020, 12:36 p.m.
Hi

This was a bad testcase, found with fsanitize=address; the final suspend
is 'suspend never' which flows off the end of the coroutine destroying
the promise and the frame.   At that point access via the handle is an
error.  Fixed by checking that the promise is destroyed via a global var.

tested on x86_64-darwin, linux
pushed to master
thanks
Iain

gcc/testsuite/ChangeLog:

	* g++.dg/coroutines/torture/co-ret-17-void-ret-coro.C: Check for
	promise destruction via a global variable.
---
 .../coroutines/torture/co-ret-17-void-ret-coro.C     | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

-- 
2.24.1

Patch

diff --git a/gcc/testsuite/g++.dg/coroutines/torture/co-ret-17-void-ret-coro.C b/gcc/testsuite/g++.dg/coroutines/torture/co-ret-17-void-ret-coro.C
index 3168ea272c1..01a75c1905d 100644
--- a/gcc/testsuite/g++.dg/coroutines/torture/co-ret-17-void-ret-coro.C
+++ b/gcc/testsuite/g++.dg/coroutines/torture/co-ret-17-void-ret-coro.C
@@ -5,14 +5,17 @@ 
 
 #include "../coro.h"
 
+int g_promise = -1;
+
 template<typename R, typename HandleRef, typename ...T>
 struct std::coroutine_traits<R, HandleRef, T...> {
     struct promise_type {
         promise_type (HandleRef h, T ...args)
         { h = std::coroutine_handle<promise_type>::from_promise (*this);
           PRINT ("Created Promise");
+          g_promise = 1;
         }
-
+	~promise_type () { PRINT ("Destroyed Promise"); g_promise = 0;}
         void get_return_object() {}
 
         auto initial_suspend() {
@@ -45,10 +48,11 @@  int main ()
 
   // initial suspend.
   h.resume ();
-  
-  if (!h.done())
+
+  // The coro should have self-destructed.
+  if (g_promise)
     {
-      PRINT ("main: apparently wasn't done...");
+      PRINT ("main: apparently we did not complete...");
       abort ();
     }