From 2dbc16552204ffa28b643949eb1f26b787017b39 Mon Sep 17 00:00:00 2001 From: Iain Sandoe Date: Wed, 24 Jun 2020 16:10:12 +0100 Subject: [PATCH] coroutines: Update tests for get-return-object errors. We updated the handling of the errors for cases when the ramp return cannot be constructed from the user's provided get-return-object method. This updates the testcases to cover this. gcc/testsuite/ChangeLog: * g++.dg/coroutines/void-gro-non-class-coro.C: Moved to... * g++.dg/coroutines/coro-bad-gro-01-void-gro-non-class-coro.C: ...here. * g++.dg/coroutines/coro-bad-gro-00-class-gro-scalar-return.C: New test. --- .../coro-bad-gro-00-class-gro-scalar-return.C | 65 +++++++++++++++++++ ...coro-bad-gro-01-void-gro-non-class-coro.C} | 2 +- 2 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/coroutines/coro-bad-gro-00-class-gro-scalar-return.C rename gcc/testsuite/g++.dg/coroutines/{void-gro-non-class-coro.C => coro-bad-gro-01-void-gro-non-class-coro.C} (99%) diff --git a/gcc/testsuite/g++.dg/coroutines/coro-bad-gro-00-class-gro-scalar-return.C b/gcc/testsuite/g++.dg/coroutines/coro-bad-gro-00-class-gro-scalar-return.C new file mode 100644 index 00000000000..bd9dec6c75f --- /dev/null +++ b/gcc/testsuite/g++.dg/coroutines/coro-bad-gro-00-class-gro-scalar-return.C @@ -0,0 +1,65 @@ +// Test handling of the case where we have a class g-r-o and a non-void +// and non-class-type ramp return. + +#include "coro.h" + +int g_promise = -1; + +struct Thing { + double x; + Thing () : x(0.0) {} + ~Thing () {} +}; + +template +struct std::coroutine_traits { + struct promise_type { + promise_type (HandleRef h, T ...args) + { h = std::coroutine_handle::from_promise (*this); + PRINT ("Created Promise"); + g_promise = 1; + } + ~promise_type () { PRINT ("Destroyed Promise"); g_promise = 0;} + Thing get_return_object() { return {}; } + + auto initial_suspend() { + return std::suspend_always{}; + } + auto final_suspend() { return std::suspend_never{}; } + + void return_void() {} + void unhandled_exception() {} + }; +}; + +int +my_coro (std::coroutine_handle<>& h) +{ + PRINT ("coro1: about to return"); + co_return; +} // { dg-error {'struct Thing' used where a 'int' was expected} } + +int main () +{ + std::coroutine_handle<> h; + int t = my_coro (h); + + if (h.done()) + { + PRINT ("main: apparently was already done..."); + abort (); + } + + // initial suspend. + h.resume (); + + // The coro should have self-destructed. + if (g_promise) + { + PRINT ("main: apparently we did not complete..."); + abort (); + } + + PRINT ("main: returning"); + return t; +} diff --git a/gcc/testsuite/g++.dg/coroutines/void-gro-non-class-coro.C b/gcc/testsuite/g++.dg/coroutines/coro-bad-gro-01-void-gro-non-class-coro.C similarity index 99% rename from gcc/testsuite/g++.dg/coroutines/void-gro-non-class-coro.C rename to gcc/testsuite/g++.dg/coroutines/coro-bad-gro-01-void-gro-non-class-coro.C index 8176c8a10af..c31fcb58b2e 100644 --- a/gcc/testsuite/g++.dg/coroutines/void-gro-non-class-coro.C +++ b/gcc/testsuite/g++.dg/coroutines/coro-bad-gro-01-void-gro-non-class-coro.C @@ -55,5 +55,5 @@ int main () } PRINT ("main: returning"); - return 0; + return t; } -- 2.30.2