xref: /llvm-project/clang/test/AST/coroutine-co_yield-source-range.cpp (revision 7c1d9b15eee3a34678addab2bab66f3020ac0753)
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)378d60e10cSdingfei Chat 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