[clang] Surface error for plain return statement in coroutine earlier (PR #100985)

Ilya Biryukov via cfe-commits cfe-commits at lists.llvm.org
Mon Jul 29 02:21:37 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}}
----------------
ilya-biryukov wrote:

Could we add tests with multiple returns?
We used to have only one error about 'return' not being allowed, but now we can potentially produce multiple (one before any coroutine statements, multiple after). It's worth specifying these aspects of the behavior so they don't accidentally change later without people consciously updating the tests.

https://github.com/llvm/llvm-project/pull/100985


More information about the cfe-commits mailing list