@@ -154,12 +154,15 @@ namespace std {
154
154
template <class PromiseType = void >
155
155
struct coroutine_handle {
156
156
static coroutine_handle from_address (void *) noexcept ;
157
+ static coroutine_handle from_promise (PromiseType &promise);
157
158
};
158
159
template <>
159
160
struct coroutine_handle <void > {
160
161
template <class PromiseType >
161
162
coroutine_handle (coroutine_handle<PromiseType>) noexcept ;
162
163
static coroutine_handle from_address (void *) noexcept ;
164
+ template <class PromiseType >
165
+ static coroutine_handle from_promise (PromiseType &promise);
163
166
};
164
167
} // namespace std
165
168
@@ -291,6 +294,38 @@ void mixed_coreturn_template2(bool b, T) {
291
294
return ; // expected-error {{not allowed in coroutine}}
292
295
}
293
296
297
+ struct promise_handle ;
298
+
299
+ struct Handle : std::coroutine_handle<promise_handle> { // expected-note 2{{candidate constructor (the implicit copy constructor) not viable}}
300
+ // expected-note@-1 2{{candidate constructor (the implicit move constructor) not viable}}
301
+ using promise_type = promise_handle;
302
+ };
303
+
304
+ struct promise_handle {
305
+ Handle get_return_object () noexcept {
306
+ { return Handle (std::coroutine_handle<Handle::promise_type>::from_promise (*this )); }
307
+ }
308
+ suspend_never initial_suspend () const noexcept { return {}; }
309
+ suspend_never final_suspend () const noexcept { return {}; }
310
+ void return_void () const noexcept {}
311
+ void unhandled_exception () const noexcept {}
312
+ };
313
+
314
+ Handle mixed_return_value () {
315
+ co_await a; // expected-note {{function is a coroutine due to use of 'co_await' here}}
316
+ return 0 ; // expected-error {{return statement not allowed in coroutine}}
317
+ // expected-error@-1 {{no viable conversion from returned value of type}}
318
+ }
319
+
320
+ Handle mixed_return_value_return_first (bool b) {
321
+ if (b) {
322
+ return 0 ; // expected-error {{no viable conversion from returned value of type}}
323
+ // expected-error@-1 {{return statement not allowed in coroutine}}
324
+ }
325
+ co_await a; // expected-note {{function is a coroutine due to use of 'co_await' here}}
326
+ co_return 0 ; // expected-error {{no member named 'return_value' in 'promise_handle'}}
327
+ }
328
+
294
329
struct CtorDtor {
295
330
CtorDtor () {
296
331
co_yield 0 ; // expected-error {{'co_yield' cannot be used in a constructor}}
0 commit comments