[committed] coroutines, testsuite: Add test for fixed pr [PR94288]

Message ID 0438434C-DBA4-4CB8-B0B1-B846C1219879@sandoe.co.uk
State New
Headers show
Series
  • [committed] coroutines, testsuite: Add test for fixed pr [PR94288]
Related show

Commit Message

Iain Sandoe April 24, 2020, 12:51 p.m.
Hi,

This is a version of the reproducer in the PR, usable on multiple platforms.

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

gcc/testsuite/

2020-04-24 Iain Sandoe <iain@sandoe.co.uk>

	PR c++/94288
	* g++.dg/coroutines/pr94288.C: New test.


-- 
2.24.1

Patch

diff --git a/gcc/testsuite/g++.dg/coroutines/pr94288.C b/gcc/testsuite/g++.dg/coroutines/pr94288.C
new file mode 100644
index 00000000000..2557e3e0f2b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/coroutines/pr94288.C
@@ -0,0 +1,70 @@ 
+//  { dg-additional-options  "-w" }
+
+#include "coro.h"
+
+#include <vector>
+
+template <typename T> struct promise {
+  T _value;
+  coro::coroutine_handle<> _continuation = nullptr;
+
+  struct final_awaitable {
+    bool _has_continuation;
+    final_awaitable(bool has_continuation)
+        : _has_continuation(has_continuation) {}
+
+    bool await_ready() const noexcept { return !_has_continuation; }
+
+    template <typename Promise>
+    coro::coroutine_handle<>
+    await_suspend(coro::coroutine_handle<Promise> coro) noexcept {
+      return coro.promise()._continuation;
+    }
+
+    void await_resume() noexcept {}
+  };
+
+  auto get_return_object() noexcept {
+    return coro::coroutine_handle<promise>::from_promise(*this);
+  }
+
+  auto initial_suspend() noexcept { return coro::suspend_always(); }
+
+  auto final_suspend() noexcept {
+    return final_awaitable(_continuation != nullptr);
+  }
+
+  void return_value(T value) { _value = value; }
+
+  void unhandled_exception() { /*std::terminate();*/ }
+
+};
+
+template <typename T> struct task {
+  using promise_type = promise<T>;
+  coro::coroutine_handle<promise<T>> _handle;
+
+  task(coro::coroutine_handle<promise<T>> handle) : _handle(handle) {}
+
+  bool await_ready() noexcept { return _handle.done(); }
+
+  coro::coroutine_handle<>
+  await_suspend(coro::coroutine_handle<> handle) noexcept {
+    _handle.promise()._continuation = handle;
+    return _handle;
+  }
+
+  T await_resume() noexcept { return _handle.promise()._value; }
+};
+
+task<std::vector<int>> foo()
+{
+  co_return std::vector<int>();
+}
+
+task<int> bar()
+{
+  while ((co_await foo()).empty()) {
+  }
+  co_return 0;
+}