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:
Iain Sandoe 2021-02-15 16:56:52 +00:00
parent 9d2a69106b
commit 9a4eb720b3
46 changed files with 49 additions and 48 deletions

View File

@ -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() {}
};

View File

@ -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() { }
};

View File

@ -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;

View File

@ -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;

View File

@ -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));
}

View File

@ -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() {}

View File

@ -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() {}

View File

@ -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();*/ };
};

View File

@ -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));
}

View File

@ -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));
}

View File

@ -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));
}

View File

@ -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));
}

View File

@ -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{};
}

View File

@ -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{};
}

View File

@ -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{};
}

View File

@ -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 {}; }

View File

@ -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() {}
};

View File

@ -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() {}
};

View File

@ -31,7 +31,7 @@ class j {
public:
std::g initial_suspend();
l final_suspend();
l final_suspend() noexcept;
};
class m : public j {
public:

View File

@ -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); }

View File

@ -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) {}

View File

@ -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() { }
};

View File

@ -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() {}
};

View File

@ -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&&) {

View File

@ -23,7 +23,7 @@ struct generator{
std::suspend_always initial_suspend (){
return {};
}
std::suspend_always final_suspend (){
std::suspend_always final_suspend () noexcept {
return {};
}

View File

@ -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>();

View File

@ -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() {}

View File

@ -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{};
}

View File

@ -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() {}

View File

@ -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{};
}

View File

@ -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{};
}

View File

@ -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{};
}

View File

@ -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{};
}

View File

@ -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{};
}

View File

@ -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{};
}

View File

@ -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{};
}

View File

@ -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:

View File

@ -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() {}

View File

@ -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{};
}

View File

@ -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{};
}

View File

@ -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{};
}

View File

@ -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{};
}

View File

@ -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{};
}

View File

@ -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

View File

@ -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 {}; }

View File

@ -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{};
}