[clang] Surface error for plain return statement in coroutine earlier (PR #100985)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 1 01:58:58 PDT 2024
================
@@ -291,6 +294,38 @@ void mixed_coreturn_template2(bool b, T) {
return; // expected-error {{not allowed in coroutine}}
}
+struct promise_handle;
+
+struct Handle : std::coroutine_handle<promise_handle> { // expected-note 2{{candidate constructor (the implicit copy constructor) not viable}}
+ // expected-note at -1 2{{candidate constructor (the implicit move constructor) not viable}}
+ using promise_type = promise_handle;
+};
+
+struct promise_handle {
+ Handle get_return_object() noexcept {
+ { return Handle(std::coroutine_handle<Handle::promise_type>::from_promise(*this)); }
+ }
+ suspend_never initial_suspend() const noexcept { return {}; }
+ suspend_never final_suspend() const noexcept { return {}; }
+ void return_void() const noexcept {}
+ void unhandled_exception() const noexcept {}
+};
+
+Handle mixed_return_value() {
+ co_await a; // expected-note {{function is a coroutine due to use of 'co_await' here}}
+ return 0; // expected-error {{return statement not allowed in coroutine}}
+ // expected-error at -1 {{no viable conversion from returned value of type}}
----------------
ivanaivanovska wrote:
Added tests for the order of the errors in the original file (coroutines.cpp) to keep the tests together and reuse the code.
https://github.com/llvm/llvm-project/pull/100985
More information about the cfe-commits
mailing list