testsuite, coroutines : Make final_suspend calls noexcept.
The wording of [dcl.fct.def.coroutine]/15 states: The expression co_await promise.final_suspend() shall not be potentially-throwing. A fair number of testcases are not correctly marked. Fixed here. gcc/testsuite/ChangeLog: * g++.dg/coroutines/co-await-void_type.C: Mark promise final_suspend call as noexcept. * g++.dg/coroutines/co-return-syntax-08-bad-return.C: Likewise. * g++.dg/coroutines/co-return-syntax-10-movable.C: Likewise. * g++.dg/coroutines/co-return-warning-1.C: Likewise. * g++.dg/coroutines/co-yield-syntax-08-needs-expr.C: Likewise. * g++.dg/coroutines/coro-bad-gro-00-class-gro-scalar-return.C: Likewise. * g++.dg/coroutines/coro-bad-gro-01-void-gro-non-class-coro.C: Likewise. * g++.dg/coroutines/coro-missing-gro.C: Likewise. * g++.dg/coroutines/coro-missing-promise-yield.C: Likewise. * g++.dg/coroutines/coro-missing-ret-value.C: Likewise. * g++.dg/coroutines/coro-missing-ret-void.C: Likewise. * g++.dg/coroutines/coro-missing-ueh.h: Likewise. * g++.dg/coroutines/coro1-allocators.h: Likewise. * g++.dg/coroutines/coro1-refs-and-ctors.h: Likewise. * g++.dg/coroutines/coro1-ret-int-yield-int.h: Likewise. * g++.dg/coroutines/pr94682-preview-this.C: Likewise. * g++.dg/coroutines/pr94752.C: Likewise. * g++.dg/coroutines/pr94760-mismatched-traits-and-promise-prev.C: Likewise. * g++.dg/coroutines/pr94879-folly-1.C: Likewise. * g++.dg/coroutines/pr94883-folly-2.C: Likewise. * g++.dg/coroutines/pr95050.C: Likewise. * g++.dg/coroutines/pr95345.C: Likewise. * g++.dg/coroutines/pr95440.C: Likewise. * g++.dg/coroutines/pr95591.C: Likewise. * g++.dg/coroutines/pr95711.C: Likewise. * g++.dg/coroutines/pr95813.C: Likewise. * g++.dg/coroutines/symmetric-transfer-00-basic.C: Likewise. * g++.dg/coroutines/torture/co-await-07-tmpl.C: Likewise. * g++.dg/coroutines/torture/co-await-17-capture-comp-ref.C: Likewise. * g++.dg/coroutines/torture/co-ret-00-void-return-is-ready.C: Likewise. * g++.dg/coroutines/torture/co-ret-01-void-return-is-suspend.C: Likewise. * g++.dg/coroutines/torture/co-ret-03-different-GRO-type.C: Likewise. * g++.dg/coroutines/torture/co-ret-04-GRO-nontriv.C: Likewise. * g++.dg/coroutines/torture/co-ret-06-template-promise-val-1.C: Likewise. * g++.dg/coroutines/torture/co-ret-08-template-cast-ret.C: Likewise. * g++.dg/coroutines/torture/co-ret-09-bool-await-susp.C: Likewise. * g++.dg/coroutines/torture/co-ret-15-default-return_void.C: Likewise. * g++.dg/coroutines/torture/co-ret-17-void-ret-coro.C: Likewise. * g++.dg/coroutines/torture/co-yield-00-triv.C: Likewise. * g++.dg/coroutines/torture/co-yield-03-tmpl.C: Likewise. * g++.dg/coroutines/torture/co-yield-04-complex-local-state.C: Likewise. * g++.dg/coroutines/torture/exceptions-test-0.C: Likewise. * g++.dg/coroutines/torture/exceptions-test-01-n4849-a.C: Likewise. * g++.dg/coroutines/torture/func-params-04.C: Likewise. * g++.dg/coroutines/torture/local-var-06-structured-binding.C: Likewise. * g++.dg/coroutines/torture/mid-suspend-destruction-0.C: Likewise.
This commit is contained in:
parent
9d2a69106b
commit
9a4eb720b3
|
@ -28,7 +28,7 @@ struct resumable::promise_type {
|
|||
return coro_handle::from_promise(*this);
|
||||
}
|
||||
auto initial_suspend() { return std::suspend_always(); }
|
||||
auto final_suspend() { return std::suspend_always(); }
|
||||
auto final_suspend() noexcept { return std::suspend_always(); }
|
||||
void yield_value(int v) { value_ = v; }
|
||||
void unhandled_exception() {}
|
||||
};
|
||||
|
|
|
@ -24,7 +24,7 @@ struct Coro {
|
|||
~promise_type() {}
|
||||
Coro get_return_object () { return Coro (handle_type::from_promise (*this)); }
|
||||
auto initial_suspend () { return coro::suspend_always{}; }
|
||||
auto final_suspend () { return coro::suspend_always{}; }
|
||||
auto final_suspend () noexcept { return coro::suspend_always{}; }
|
||||
void return_void () { }
|
||||
void unhandled_exception() { }
|
||||
};
|
||||
|
|
|
@ -32,7 +32,7 @@ struct coro1 {
|
|||
|
||||
auto get_return_object () { return handle_type::from_promise (*this);}
|
||||
coro::suspend_always initial_suspend () const { return {}; }
|
||||
coro::suspend_always final_suspend () const { return {}; }
|
||||
coro::suspend_always final_suspend () const noexcept { return {}; }
|
||||
|
||||
void return_value(T&& v) noexcept { value = std::move(v); }
|
||||
void return_value(const T&) noexcept = delete;
|
||||
|
|
|
@ -28,7 +28,7 @@ struct resumable::promise_type {
|
|||
return coro_handle::from_promise(*this);
|
||||
}
|
||||
auto initial_suspend() { return std::suspend_always(); }
|
||||
auto final_suspend() { return std::suspend_always(); }
|
||||
auto final_suspend() noexcept { return std::suspend_always(); }
|
||||
void return_value(int v) { value_ = v; }
|
||||
std::suspend_always yield_value(int v) {
|
||||
value_ = v;
|
||||
|
|
|
@ -10,7 +10,7 @@ struct DummyYield {
|
|||
DummyYield (coro::coroutine_handle<> handle) : handle (handle) {}
|
||||
struct dummy_yield {
|
||||
coro::suspend_never initial_suspend() { return {}; }
|
||||
coro::suspend_never final_suspend() { return {}; }
|
||||
coro::suspend_never final_suspend() noexcept { return {}; }
|
||||
DummyYield get_return_object() {
|
||||
return DummyYield (coro::coroutine_handle<dummy_yield>::from_promise (*this));
|
||||
}
|
||||
|
|
|
@ -21,11 +21,11 @@ struct std::coroutine_traits<R, HandleRef, T...> {
|
|||
}
|
||||
~promise_type () { PRINT ("Destroyed Promise"); g_promise = 0;}
|
||||
Thing get_return_object() { return {}; }
|
||||
|
||||
//int get_return_object() { return 0; }
|
||||
auto initial_suspend() {
|
||||
return std::suspend_always{};
|
||||
}
|
||||
auto final_suspend() { return std::suspend_never{}; }
|
||||
auto final_suspend() noexcept { return std::suspend_never{}; }
|
||||
|
||||
void return_void() {}
|
||||
void unhandled_exception() {}
|
||||
|
|
|
@ -19,7 +19,7 @@ struct std::coroutine_traits<R, HandleRef, T...> {
|
|||
auto initial_suspend() {
|
||||
return std::suspend_always{};
|
||||
}
|
||||
auto final_suspend() { return std::suspend_never{}; }
|
||||
auto final_suspend() noexcept { return std::suspend_never{}; }
|
||||
|
||||
void return_void() {}
|
||||
void unhandled_exception() {}
|
||||
|
|
|
@ -10,7 +10,7 @@ struct MissingGRO {
|
|||
MissingGRO (coro::coroutine_handle<> handle) : handle (handle) {}
|
||||
struct missing_gro {
|
||||
coro::suspend_never initial_suspend() { return {}; }
|
||||
coro::suspend_never final_suspend() { return {}; }
|
||||
coro::suspend_never final_suspend() noexcept { return {}; }
|
||||
void return_void () {}
|
||||
void unhandled_exception() { /*std::terminate();*/ };
|
||||
};
|
||||
|
|
|
@ -7,7 +7,7 @@ struct MissingPromiseYield {
|
|||
MissingPromiseYield (coro::coroutine_handle<> handle) : handle (handle) {}
|
||||
struct missing_yield {
|
||||
coro::suspend_never initial_suspend() { return {}; }
|
||||
coro::suspend_never final_suspend() { return {}; }
|
||||
coro::suspend_never final_suspend() noexcept { return {}; }
|
||||
MissingPromiseYield get_return_object() {
|
||||
return MissingPromiseYield (coro::coroutine_handle<missing_yield>::from_promise (*this));
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@ struct MissingRetValue {
|
|||
MissingRetValue (coro::coroutine_handle<> handle) : handle (handle) {}
|
||||
struct missing_retvoid {
|
||||
coro::suspend_never initial_suspend() { return {}; }
|
||||
coro::suspend_never final_suspend() { return {}; }
|
||||
coro::suspend_never final_suspend() noexcept { return {}; }
|
||||
MissingRetValue get_return_object() {
|
||||
return MissingRetValue (coro::coroutine_handle<missing_retvoid>::from_promise (*this));
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@ struct MissingRetVoid {
|
|||
MissingRetVoid (coro::coroutine_handle<> handle) : handle (handle) {}
|
||||
struct missing_retvoid {
|
||||
coro::suspend_never initial_suspend() { return {}; }
|
||||
coro::suspend_never final_suspend() { return {}; }
|
||||
coro::suspend_never final_suspend() noexcept { return {}; }
|
||||
MissingRetVoid get_return_object() {
|
||||
return MissingRetVoid (coro::coroutine_handle<missing_retvoid>::from_promise (*this));
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@ struct MissingUEH {
|
|||
MissingUEH (coro::coroutine_handle<> handle) : handle (handle) {}
|
||||
struct missing_ueh {
|
||||
coro::suspend_never initial_suspend() { return {}; }
|
||||
coro::suspend_never final_suspend() { return {}; }
|
||||
coro::suspend_never final_suspend() noexcept { return {}; }
|
||||
MissingUEH get_return_object() {
|
||||
return MissingUEH (coro::coroutine_handle<missing_ueh>::from_promise (*this));
|
||||
}
|
||||
|
|
|
@ -100,7 +100,7 @@ struct coro1 {
|
|||
PRINT ("get initial_suspend (always)");
|
||||
return suspend_always_prt{};
|
||||
}
|
||||
auto final_suspend () {
|
||||
auto final_suspend () noexcept {
|
||||
PRINT ("get final_suspend (always)");
|
||||
return suspend_always_prt{};
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@ struct coro1 {
|
|||
PRINT ("get initial_suspend (always)");
|
||||
return suspend_always_prt{};
|
||||
}
|
||||
auto final_suspend () {
|
||||
auto final_suspend () noexcept {
|
||||
PRINT ("get final_suspend (always)");
|
||||
return suspend_always_prt{};
|
||||
}
|
||||
|
|
|
@ -108,7 +108,7 @@ struct coro1 {
|
|||
#endif
|
||||
#ifdef MISSING_FINAL_SUSPEND
|
||||
#else
|
||||
auto final_suspend () {
|
||||
auto final_suspend () noexcept {
|
||||
PRINT ("get final_suspend (always)");
|
||||
return suspend_always_prt{};
|
||||
}
|
||||
|
|
|
@ -13,7 +13,7 @@ struct promise
|
|||
promise(Class &,int) { static_assert(!std::is_pointer<Class>::value, ""); }
|
||||
|
||||
coro::suspend_never initial_suspend() { return {}; }
|
||||
coro::suspend_never final_suspend() { return {}; }
|
||||
coro::suspend_never final_suspend() noexcept { return {}; }
|
||||
|
||||
future get_return_object() { return {}; }
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@ struct task {
|
|||
promise_type() {}
|
||||
task get_return_object() { return {}; }
|
||||
suspend_never initial_suspend() { return {}; }
|
||||
suspend_never final_suspend() { return {}; }
|
||||
suspend_never final_suspend() noexcept { return {}; }
|
||||
void return_void() {}
|
||||
void unhandled_exception() {}
|
||||
};
|
||||
|
|
|
@ -14,7 +14,7 @@ struct std::coroutine_traits<R, CallOp, T...> {
|
|||
promise_type (CallOp op, T ...args) {}
|
||||
Fake get_return_object() { return {}; }
|
||||
std::suspend_always initial_suspend() { return {}; }
|
||||
std::suspend_never final_suspend() { return {}; }
|
||||
std::suspend_never final_suspend() noexcept { return {}; }
|
||||
void return_void() {}
|
||||
void unhandled_exception() {}
|
||||
};
|
||||
|
|
|
@ -31,7 +31,7 @@ class j {
|
|||
|
||||
public:
|
||||
std::g initial_suspend();
|
||||
l final_suspend();
|
||||
l final_suspend() noexcept;
|
||||
};
|
||||
class m : public j {
|
||||
public:
|
||||
|
|
|
@ -24,7 +24,7 @@ class h {
|
|||
public:
|
||||
void get_return_object();
|
||||
std::b initial_suspend();
|
||||
j final_suspend();
|
||||
j final_suspend() noexcept;
|
||||
void unhandled_exception();
|
||||
template <typename g>
|
||||
auto await_transform (g c) { return ab(f, c); }
|
||||
|
|
|
@ -21,7 +21,7 @@ struct task
|
|||
{
|
||||
auto get_return_object () -> task { return {}; }
|
||||
auto initial_suspend () -> suspend_always { return {}; }
|
||||
auto final_suspend () -> suspend_always { return {}; }
|
||||
auto final_suspend () noexcept -> suspend_always { return {}; }
|
||||
void return_void () {}
|
||||
void unhandled_exception () { }
|
||||
void thing (ret_type x) {}
|
||||
|
|
|
@ -14,7 +14,7 @@ struct dummy_coro
|
|||
void await_resume() { }
|
||||
dummy_coro get_return_object() { return {}; }
|
||||
dummy_coro initial_suspend() { return {}; }
|
||||
dummy_coro final_suspend() { return {}; }
|
||||
dummy_coro final_suspend() noexcept { return {}; }
|
||||
void return_void() { }
|
||||
void unhandled_exception() { }
|
||||
};
|
||||
|
|
|
@ -22,7 +22,7 @@ struct task
|
|||
// static constexpr suspend_n initial_suspend() { return {2}; }
|
||||
#endif
|
||||
static constexpr std::suspend_always initial_suspend() { return {}; }
|
||||
static constexpr std::suspend_never final_suspend() { return {}; }
|
||||
static constexpr std::suspend_never final_suspend() noexcept { return {}; }
|
||||
static constexpr void return_void() {}
|
||||
static constexpr void unhandled_exception() {}
|
||||
};
|
||||
|
|
|
@ -12,7 +12,7 @@ struct generator {
|
|||
void return_void();
|
||||
void unhandled_exception();
|
||||
suspend_always initial_suspend();
|
||||
suspend_always final_suspend();
|
||||
suspend_always final_suspend() noexcept;
|
||||
|
||||
template<typename Arg>
|
||||
suspend_always yield_value(Arg&&) {
|
||||
|
|
|
@ -23,7 +23,7 @@ struct generator{
|
|||
std::suspend_always initial_suspend (){
|
||||
return {};
|
||||
}
|
||||
std::suspend_always final_suspend (){
|
||||
std::suspend_always final_suspend () noexcept {
|
||||
return {};
|
||||
}
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@ template <typename T, typename... Args>
|
|||
struct coroutine_traits<lazy<T>, Args...> {
|
||||
struct promise_type {
|
||||
suspend_always initial_suspend() const { return {}; }
|
||||
suspend_always final_suspend() const { return {}; }
|
||||
suspend_always final_suspend() const noexcept { return {}; }
|
||||
void return_value(T val) {}
|
||||
lazy<T> get_return_object() {
|
||||
return lazy<T>();
|
||||
|
|
|
@ -44,7 +44,7 @@ struct Loopy {
|
|||
}
|
||||
|
||||
coro::suspend_always initial_suspend() { return {}; }
|
||||
coro::suspend_always final_suspend() { return {}; }
|
||||
coro::suspend_always final_suspend() noexcept { return {}; }
|
||||
|
||||
void unhandled_exception() { /*std::terminate();*/ }
|
||||
void return_void() {}
|
||||
|
|
|
@ -71,7 +71,7 @@ struct coro1 {
|
|||
return suspend_never_prt{};
|
||||
}
|
||||
|
||||
auto final_suspend() {
|
||||
auto final_suspend() noexcept {
|
||||
PRINT ("get final_suspend");
|
||||
return suspend_always_prt{};
|
||||
}
|
||||
|
|
|
@ -20,7 +20,7 @@ struct resumable::promise_type {
|
|||
return coro_handle::from_promise(*this);
|
||||
}
|
||||
auto initial_suspend() { return std::suspend_never(); }
|
||||
auto final_suspend() { return std::suspend_always(); }
|
||||
auto final_suspend() noexcept { return std::suspend_always(); }
|
||||
void return_value(int x) {used = x;}
|
||||
void unhandled_exception() {}
|
||||
|
||||
|
|
|
@ -57,7 +57,7 @@ struct coro1 {
|
|||
PRINT ("get initial_suspend (never) ");
|
||||
return suspend_never_prt{};
|
||||
}
|
||||
auto final_suspend () {
|
||||
auto final_suspend () noexcept {
|
||||
PRINT ("get final_suspend (always) ");
|
||||
return suspend_always_prt{};
|
||||
}
|
||||
|
|
|
@ -57,7 +57,7 @@ struct coro1 {
|
|||
PRINT ("get initial_suspend (always)");
|
||||
return suspend_always_prt{};
|
||||
}
|
||||
auto final_suspend () {
|
||||
auto final_suspend () noexcept {
|
||||
PRINT ("get final_suspend (always)");
|
||||
return suspend_always_prt{};
|
||||
}
|
||||
|
|
|
@ -55,7 +55,7 @@ struct coro1 {
|
|||
PRINT ("get initial_suspend (always)");
|
||||
return suspend_always_prt{};
|
||||
}
|
||||
auto final_suspend () {
|
||||
auto final_suspend () noexcept {
|
||||
PRINT ("get final_suspend (always)");
|
||||
return suspend_always_prt{};
|
||||
}
|
||||
|
|
|
@ -72,7 +72,7 @@ struct coro1 {
|
|||
PRINT ("get initial_suspend (always)");
|
||||
return suspend_always_prt{};
|
||||
}
|
||||
auto final_suspend () {
|
||||
auto final_suspend () noexcept {
|
||||
PRINT ("get final_suspend (always)");
|
||||
return suspend_always_prt{};
|
||||
}
|
||||
|
|
|
@ -63,7 +63,7 @@ struct coro1 {
|
|||
PRINT ("get initial_suspend (always)");
|
||||
return suspend_always_prt{};
|
||||
}
|
||||
auto final_suspend () const {
|
||||
auto final_suspend () const noexcept {
|
||||
PRINT ("get final_suspend (always)");
|
||||
return suspend_always_prt{};
|
||||
}
|
||||
|
|
|
@ -60,7 +60,7 @@ struct coro1 {
|
|||
PRINT ("get initial_suspend (always)");
|
||||
return suspend_always_prt{};
|
||||
}
|
||||
suspend_always_prt final_suspend () const {
|
||||
suspend_always_prt final_suspend () const noexcept {
|
||||
PRINT ("get final_suspend (always)");
|
||||
return suspend_always_prt{};
|
||||
}
|
||||
|
|
|
@ -70,7 +70,7 @@ struct coro1 {
|
|||
PRINT ("get initial_suspend (always, but really never) ");
|
||||
return suspend_always_prt{};
|
||||
}
|
||||
auto final_suspend () {
|
||||
auto final_suspend () noexcept {
|
||||
PRINT ("get final_suspend (always, but never) ");
|
||||
return suspend_always_prt{};
|
||||
}
|
||||
|
|
|
@ -28,7 +28,7 @@ public:
|
|||
using coro_handle = std::coroutine_handle<promise_type>;
|
||||
auto get_return_object() { return coro_handle::from_promise(*this); }
|
||||
auto initial_suspend() { return std::suspend_always(); }
|
||||
auto final_suspend() { return std::suspend_always(); }
|
||||
auto final_suspend() noexcept { return std::suspend_always(); }
|
||||
void return_void() { value_ = -1; }
|
||||
void unhandled_exception() {}
|
||||
private:
|
||||
|
|
|
@ -21,7 +21,7 @@ struct std::coroutine_traits<R, HandleRef, T...> {
|
|||
auto initial_suspend() {
|
||||
return std::suspend_always{};
|
||||
}
|
||||
auto final_suspend() { return std::suspend_never{}; }
|
||||
auto final_suspend() noexcept { return std::suspend_never{}; }
|
||||
|
||||
void return_void() {}
|
||||
void unhandled_exception() {}
|
||||
|
|
|
@ -62,7 +62,7 @@ struct coro1 {
|
|||
PRINT ("get initial_suspend (always)");
|
||||
return suspend_always_prt{};
|
||||
}
|
||||
auto final_suspend () {
|
||||
auto final_suspend () noexcept {
|
||||
PRINT ("get final_suspend (always)");
|
||||
return suspend_always_prt{};
|
||||
}
|
||||
|
|
|
@ -22,7 +22,7 @@ struct looper {
|
|||
return suspend_always_prt{};
|
||||
}
|
||||
|
||||
auto final_suspend () {
|
||||
auto final_suspend () noexcept {
|
||||
PRINT ("get final_suspend (always)");
|
||||
return suspend_always_prt{};
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@ struct looper {
|
|||
return suspend_always_prt{};
|
||||
}
|
||||
|
||||
auto final_suspend () {
|
||||
auto final_suspend () noexcept {
|
||||
PRINT ("get final_suspend (always)");
|
||||
return suspend_always_prt{};
|
||||
}
|
||||
|
|
|
@ -60,7 +60,7 @@ struct coro1 {
|
|||
PRINT ("get initial_suspend (always)");
|
||||
return suspend_always_prt{};
|
||||
}
|
||||
auto final_suspend () {
|
||||
auto final_suspend () noexcept {
|
||||
PRINT ("get final_suspend (always)");
|
||||
return suspend_always_prt{};
|
||||
}
|
||||
|
|
|
@ -87,7 +87,7 @@ struct coro1 {
|
|||
PRINT ("get initial_suspend (always)");
|
||||
return suspend_always_susp_throws_prt(throw_control);
|
||||
}
|
||||
auto final_suspend () {
|
||||
auto final_suspend () noexcept {
|
||||
PRINT ("get final_suspend (always)");
|
||||
return suspend_always_prt{};
|
||||
}
|
||||
|
|
|
@ -12,6 +12,7 @@ struct nontriv {
|
|||
int a, b, c;
|
||||
nontriv (int _a, int _b, int _c) : a(_a), b(_b), c(_c) {}
|
||||
virtual int getA () { return a; }
|
||||
~nontriv() { a = -1; }
|
||||
};
|
||||
|
||||
struct coro1
|
||||
|
@ -19,12 +20,12 @@ f (nontriv t) noexcept
|
|||
{
|
||||
if (t.a > 30)
|
||||
{
|
||||
PRINTF ("coro1: about to return %d", t.b);
|
||||
PRINTF ("coro1: about to return %d\n", t.b);
|
||||
co_return t.b;
|
||||
}
|
||||
else if (t.a > 20)
|
||||
{
|
||||
PRINTF ("coro1: about to co-return %d", t.c);
|
||||
PRINTF ("coro1: about to co-return %d\n", t.c);
|
||||
co_return t.c;
|
||||
}
|
||||
else
|
||||
|
|
|
@ -15,7 +15,7 @@ struct promise
|
|||
promise (Args&... args) {}
|
||||
|
||||
coro::suspend_never initial_suspend() { return {}; }
|
||||
coro::suspend_never final_suspend() { return {}; }
|
||||
coro::suspend_never final_suspend() noexcept { return {}; }
|
||||
|
||||
future get_return_object() { return {}; }
|
||||
|
||||
|
|
|
@ -61,7 +61,7 @@ struct coro1 {
|
|||
PRINT ("get initial_suspend (always)");
|
||||
return suspend_always_prt{};
|
||||
}
|
||||
auto final_suspend () {
|
||||
auto final_suspend () noexcept {
|
||||
PRINT ("get final_suspend (always)");
|
||||
return suspend_always_prt{};
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue