Hi, Just an improvement to test-coverage, tested on x86_64-darwin,linux powerpc64-linux
applied to master, thanks Iain ===== 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<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;} + 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.24.1