diff options
author | Iain Sandoe <iain@sandoe.co.uk> | 2020-06-24 16:10:12 +0100 |
---|---|---|
committer | Iain Sandoe <iain@sandoe.co.uk> | 2020-06-24 21:04:51 +0100 |
commit | 2dbc16552204ffa28b643949eb1f26b787017b39 (patch) | |
tree | 53f525dd2b264c85c92bbd3f8968510b0534ec27 | |
parent | 3faa0dde31720a59082b038a9f50f5703711bb53 (diff) | |
download | gcc-2dbc16552204ffa28b643949eb1f26b787017b39.zip gcc-2dbc16552204ffa28b643949eb1f26b787017b39.tar.gz gcc-2dbc16552204ffa28b643949eb1f26b787017b39.tar.bz2 |
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.
-rw-r--r-- | gcc/testsuite/g++.dg/coroutines/coro-bad-gro-00-class-gro-scalar-return.C | 65 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/coroutines/coro-bad-gro-01-void-gro-non-class-coro.C (renamed from gcc/testsuite/g++.dg/coroutines/void-gro-non-class-coro.C) | 2 |
2 files changed, 66 insertions, 1 deletions
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 0000000..bd9dec6 --- /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 index 8176c8a..c31fcb5 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; } |