[Coroutines] Ensure co_await promise.final_suspend() does not throw
Summary:
This patch addresses https://bugs.llvm.org/show_bug.cgi?id=46256
The spec of coroutine requires that the expression co_await promise.final_suspend() shall not be potentially-throwing.
To check this, we recursively look at every call (including Call, MemberCall, OperatorCall and Constructor) in all code
generated by the final suspend, and ensure that the callees are declared with noexcept. We also look at any returned data
type that requires explicit destruction, and check their destructors for noexcept.
This patch does not check declarations with dependent types yet, which will be done in future patches.
Updated all tests to add noexcept to the required functions, and added a dedicated test for this patch.
This patch might start to cause existing codebase fail to compile because most people may not have been strict in tagging
all the related functions noexcept.
Reviewers: lewissbaker, modocache, junparser
Reviewed By: modocache
Subscribers: arphaman, junparser, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D82029
2020-06-16 07:27:41 +08:00
|
|
|
// This file contains references to sections of the Coroutines TS, which can be
|
|
|
|
// found at http://wg21.link/coroutines.
|
|
|
|
|
|
|
|
// RUN: %clang_cc1 -std=c++14 -fcoroutines-ts -verify %s -fcxx-exceptions -fexceptions -Wunused-result
|
|
|
|
|
|
|
|
namespace std {
|
|
|
|
namespace experimental {
|
|
|
|
|
|
|
|
template <class Ret, typename... T>
|
|
|
|
struct coroutine_traits { using promise_type = typename Ret::promise_type; };
|
|
|
|
|
|
|
|
template <class Promise = void>
|
|
|
|
struct coroutine_handle {
|
2020-06-23 05:38:41 +08:00
|
|
|
static coroutine_handle from_address(void *); // expected-note 2 {{must be declared with 'noexcept'}}
|
[Coroutines] Ensure co_await promise.final_suspend() does not throw
Summary:
This patch addresses https://bugs.llvm.org/show_bug.cgi?id=46256
The spec of coroutine requires that the expression co_await promise.final_suspend() shall not be potentially-throwing.
To check this, we recursively look at every call (including Call, MemberCall, OperatorCall and Constructor) in all code
generated by the final suspend, and ensure that the callees are declared with noexcept. We also look at any returned data
type that requires explicit destruction, and check their destructors for noexcept.
This patch does not check declarations with dependent types yet, which will be done in future patches.
Updated all tests to add noexcept to the required functions, and added a dedicated test for this patch.
This patch might start to cause existing codebase fail to compile because most people may not have been strict in tagging
all the related functions noexcept.
Reviewers: lewissbaker, modocache, junparser
Reviewed By: modocache
Subscribers: arphaman, junparser, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D82029
2020-06-16 07:27:41 +08:00
|
|
|
};
|
|
|
|
template <>
|
|
|
|
struct coroutine_handle<void> {
|
|
|
|
template <class PromiseType>
|
2020-06-23 05:38:41 +08:00
|
|
|
coroutine_handle(coroutine_handle<PromiseType>); // expected-note 2 {{must be declared with 'noexcept'}}
|
[Coroutines] Ensure co_await promise.final_suspend() does not throw
Summary:
This patch addresses https://bugs.llvm.org/show_bug.cgi?id=46256
The spec of coroutine requires that the expression co_await promise.final_suspend() shall not be potentially-throwing.
To check this, we recursively look at every call (including Call, MemberCall, OperatorCall and Constructor) in all code
generated by the final suspend, and ensure that the callees are declared with noexcept. We also look at any returned data
type that requires explicit destruction, and check their destructors for noexcept.
This patch does not check declarations with dependent types yet, which will be done in future patches.
Updated all tests to add noexcept to the required functions, and added a dedicated test for this patch.
This patch might start to cause existing codebase fail to compile because most people may not have been strict in tagging
all the related functions noexcept.
Reviewers: lewissbaker, modocache, junparser
Reviewed By: modocache
Subscribers: arphaman, junparser, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D82029
2020-06-16 07:27:41 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
struct suspend_never {
|
2020-06-23 05:38:41 +08:00
|
|
|
bool await_ready() { return true; } // expected-note 2 {{must be declared with 'noexcept'}}
|
|
|
|
void await_suspend(coroutine_handle<>) {} // expected-note 2 {{must be declared with 'noexcept'}}
|
|
|
|
void await_resume() {} // expected-note 2 {{must be declared with 'noexcept'}}
|
|
|
|
~suspend_never() noexcept(false); // expected-note 2 {{must be declared with 'noexcept'}}
|
[Coroutines] Ensure co_await promise.final_suspend() does not throw
Summary:
This patch addresses https://bugs.llvm.org/show_bug.cgi?id=46256
The spec of coroutine requires that the expression co_await promise.final_suspend() shall not be potentially-throwing.
To check this, we recursively look at every call (including Call, MemberCall, OperatorCall and Constructor) in all code
generated by the final suspend, and ensure that the callees are declared with noexcept. We also look at any returned data
type that requires explicit destruction, and check their destructors for noexcept.
This patch does not check declarations with dependent types yet, which will be done in future patches.
Updated all tests to add noexcept to the required functions, and added a dedicated test for this patch.
This patch might start to cause existing codebase fail to compile because most people may not have been strict in tagging
all the related functions noexcept.
Reviewers: lewissbaker, modocache, junparser
Reviewed By: modocache
Subscribers: arphaman, junparser, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D82029
2020-06-16 07:27:41 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
struct suspend_always {
|
|
|
|
bool await_ready() { return false; }
|
|
|
|
void await_suspend(coroutine_handle<>) {}
|
|
|
|
void await_resume() {}
|
2020-06-23 05:38:41 +08:00
|
|
|
suspend_never operator co_await(); // expected-note 2 {{must be declared with 'noexcept'}}
|
|
|
|
~suspend_always() noexcept(false); // expected-note 2 {{must be declared with 'noexcept'}}
|
[Coroutines] Ensure co_await promise.final_suspend() does not throw
Summary:
This patch addresses https://bugs.llvm.org/show_bug.cgi?id=46256
The spec of coroutine requires that the expression co_await promise.final_suspend() shall not be potentially-throwing.
To check this, we recursively look at every call (including Call, MemberCall, OperatorCall and Constructor) in all code
generated by the final suspend, and ensure that the callees are declared with noexcept. We also look at any returned data
type that requires explicit destruction, and check their destructors for noexcept.
This patch does not check declarations with dependent types yet, which will be done in future patches.
Updated all tests to add noexcept to the required functions, and added a dedicated test for this patch.
This patch might start to cause existing codebase fail to compile because most people may not have been strict in tagging
all the related functions noexcept.
Reviewers: lewissbaker, modocache, junparser
Reviewed By: modocache
Subscribers: arphaman, junparser, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D82029
2020-06-16 07:27:41 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace experimental
|
|
|
|
} // namespace std
|
|
|
|
|
|
|
|
using namespace std::experimental;
|
|
|
|
|
|
|
|
struct A {
|
|
|
|
bool await_ready();
|
|
|
|
void await_resume();
|
|
|
|
template <typename F>
|
|
|
|
void await_suspend(F);
|
|
|
|
};
|
|
|
|
|
|
|
|
struct coro_t {
|
|
|
|
struct promise_type {
|
|
|
|
coro_t get_return_object();
|
|
|
|
suspend_never initial_suspend();
|
2020-06-23 05:38:41 +08:00
|
|
|
suspend_always final_suspend(); // expected-note 2 {{must be declared with 'noexcept'}}
|
[Coroutines] Ensure co_await promise.final_suspend() does not throw
Summary:
This patch addresses https://bugs.llvm.org/show_bug.cgi?id=46256
The spec of coroutine requires that the expression co_await promise.final_suspend() shall not be potentially-throwing.
To check this, we recursively look at every call (including Call, MemberCall, OperatorCall and Constructor) in all code
generated by the final suspend, and ensure that the callees are declared with noexcept. We also look at any returned data
type that requires explicit destruction, and check their destructors for noexcept.
This patch does not check declarations with dependent types yet, which will be done in future patches.
Updated all tests to add noexcept to the required functions, and added a dedicated test for this patch.
This patch might start to cause existing codebase fail to compile because most people may not have been strict in tagging
all the related functions noexcept.
Reviewers: lewissbaker, modocache, junparser
Reviewed By: modocache
Subscribers: arphaman, junparser, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D82029
2020-06-16 07:27:41 +08:00
|
|
|
void return_void();
|
|
|
|
static void unhandled_exception();
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
coro_t f(int n) { // expected-error {{the expression 'co_await __promise.final_suspend()' is required to be non-throwing}}
|
|
|
|
A a{};
|
|
|
|
co_await a;
|
|
|
|
}
|
2020-06-23 05:38:41 +08:00
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
coro_t f_dep(T n) { // expected-error {{the expression 'co_await __promise.final_suspend()' is required to be non-throwing}}
|
|
|
|
A a{};
|
|
|
|
co_await a;
|
|
|
|
}
|
|
|
|
|
|
|
|
void foo() {
|
|
|
|
f_dep<int>(5); // expected-note {{in instantiation of function template specialization 'f_dep<int>' requested here}}
|
|
|
|
}
|