18d60e10cSdingfei // RUN: %clang_cc1 -triple x86_64-apple-darwin9 %s -std=c++20 \ 2*7c1d9b15SFangrui Song // RUN: -ast-dump | FileCheck %s 38d60e10cSdingfei 48d60e10cSdingfei #include "Inputs/std-coroutine.h" 58d60e10cSdingfei 68d60e10cSdingfei using namespace std; 78d60e10cSdingfei 88d60e10cSdingfei struct Chat { 98d60e10cSdingfei struct promise_type { initial_suspendChat::promise_type108d60e10cSdingfei std::suspend_always initial_suspend() { return {}; } get_return_objectChat::promise_type118d60e10cSdingfei Chat get_return_object() { 128d60e10cSdingfei return std::coroutine_handle<promise_type>::from_promise(*this); 138d60e10cSdingfei } yield_valueChat::promise_type148d60e10cSdingfei std::suspend_always yield_value(int m) { return {}; } final_suspendChat::promise_type158d60e10cSdingfei std::suspend_always final_suspend() noexcept { return {}; } return_valueChat::promise_type168d60e10cSdingfei std::suspend_always return_value(int) { return {}; } unhandled_exceptionChat::promise_type178d60e10cSdingfei void unhandled_exception() {} 188d60e10cSdingfei await_transformChat::promise_type198d60e10cSdingfei auto await_transform(int s) { 208d60e10cSdingfei struct awaiter { 218d60e10cSdingfei promise_type *promise; 228d60e10cSdingfei bool await_ready() { return true; } 238d60e10cSdingfei int await_resume() { return promise->message; } 248d60e10cSdingfei void await_suspend(std::coroutine_handle<>) {} 258d60e10cSdingfei }; 268d60e10cSdingfei 278d60e10cSdingfei return awaiter{this}; 288d60e10cSdingfei } 298d60e10cSdingfei int message; 308d60e10cSdingfei }; 318d60e10cSdingfei 328d60e10cSdingfei Chat(std::coroutine_handle<promise_type> promise); 338d60e10cSdingfei 348d60e10cSdingfei std::coroutine_handle<promise_type> handle; 358d60e10cSdingfei }; 368d60e10cSdingfei f(int s)378d60e10cSdingfeiChat f(int s) { 388d60e10cSdingfei // CHECK: CoyieldExpr {{.*}} <col:3, col:12> 398d60e10cSdingfei // CHECK-NEXT: CXXMemberCallExpr {{.*}} <col:3, col:12> {{.*}} 408d60e10cSdingfei // CHECK-NEXT: MemberExpr {{.*}} <col:3> {{.*}} 418d60e10cSdingfei // CHECK-NEXT: DeclRefExpr {{.*}} <col:3> {{.*}} 428d60e10cSdingfei // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:12> {{.*}} 438d60e10cSdingfei // CHECK-NEXT: DeclRefExpr {{.*}} <col:12> {{.*}} 448d60e10cSdingfei co_yield s; 458d60e10cSdingfei // CHECK: CoreturnStmt {{.*}} <line:{{.*}}:3, col:13> 468d60e10cSdingfei co_return s; 478d60e10cSdingfei // CHECK: CoawaitExpr {{.*}} <col:3, col:12> 'int' 488d60e10cSdingfei co_await s; 498d60e10cSdingfei } 50