aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIain Sandoe <iain@sandoe.co.uk>2020-06-24 16:10:12 +0100
committerIain Sandoe <iain@sandoe.co.uk>2020-06-24 21:04:51 +0100
commit2dbc16552204ffa28b643949eb1f26b787017b39 (patch)
tree53f525dd2b264c85c92bbd3f8968510b0534ec27
parent3faa0dde31720a59082b038a9f50f5703711bb53 (diff)
downloadgcc-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.C65
-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;
}