From 1d072f3eeac486a7c6a2b1c093f1f3eebef59947 Mon Sep 17 00:00:00 2001 From: Iain Sandoe Date: Fri, 24 Apr 2020 09:17:06 +0100 Subject: [PATCH] coroutines, testsuite: Add test for fixed pr [PR94288] This is a version of the reproducer in the PR, usable on multiple platforms. --- gcc/testsuite/ChangeLog | 5 ++ gcc/testsuite/g++.dg/coroutines/pr94288.C | 70 +++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 gcc/testsuite/g++.dg/coroutines/pr94288.C diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e6b8812061d..33edc25076d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-04-24 Iain Sandoe + + PR c++/94288 + * g++.dg/coroutines/pr94288.C: New test. + 2020-04-24 Alexandre Oliva * 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 00000000000..2557e3e0f2b --- /dev/null +++ b/gcc/testsuite/g++.dg/coroutines/pr94288.C @@ -0,0 +1,70 @@ +// { dg-additional-options "-w" } + +#include "coro.h" + +#include + +template 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 + coro::coroutine_handle<> + await_suspend(coro::coroutine_handle coro) noexcept { + return coro.promise()._continuation; + } + + void await_resume() noexcept {} + }; + + auto get_return_object() noexcept { + return coro::coroutine_handle::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 struct task { + using promise_type = promise; + coro::coroutine_handle> _handle; + + task(coro::coroutine_handle> 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> foo() +{ + co_return std::vector(); +} + +task bar() +{ + while ((co_await foo()).empty()) { + } + co_return 0; +} -- 2.30.2