diff options
author | Iain Sandoe <iain@sandoe.co.uk> | 2020-04-24 09:17:06 +0100 |
---|---|---|
committer | Iain Sandoe <iain@sandoe.co.uk> | 2020-04-24 13:47:31 +0100 |
commit | 1d072f3eeac486a7c6a2b1c093f1f3eebef59947 (patch) | |
tree | 834228fa4d91c00f0f132987f4b3b6edd9c8d428 | |
parent | 3685c5adf5c0b30268cb8f95c89e4c4a3240ae6f (diff) | |
download | gcc-1d072f3eeac486a7c6a2b1c093f1f3eebef59947.zip gcc-1d072f3eeac486a7c6a2b1c093f1f3eebef59947.tar.gz gcc-1d072f3eeac486a7c6a2b1c093f1f3eebef59947.tar.bz2 |
coroutines, testsuite: Add test for fixed pr [PR94288]
This is a version of the reproducer in the PR, usable on
multiple platforms.
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/coroutines/pr94288.C | 70 |
2 files changed, 75 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e6b8812..33edc25 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-04-24 Iain Sandoe <iain@sandoe.co.uk> + + PR c++/94288 + * g++.dg/coroutines/pr94288.C: New test. + 2020-04-24 Alexandre Oliva <oliva@adacore.com> * lib/target-supports.exp (check_effective_target_fileio): New. diff --git a/gcc/testsuite/g++.dg/coroutines/pr94288.C b/gcc/testsuite/g++.dg/coroutines/pr94288.C new file mode 100644 index 0000000..2557e3e --- /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; +} |