xref: /llvm-project/clang/test/AST/coroutine-co_yield-source-range.cpp (revision 7c1d9b15eee3a34678addab2bab66f3020ac0753)
1 // RUN: %clang_cc1 -triple x86_64-apple-darwin9 %s -std=c++20 \
2 // RUN:    -ast-dump | FileCheck %s
3 
4 #include "Inputs/std-coroutine.h"
5 
6 using namespace std;
7 
8 struct Chat {
9   struct promise_type {
initial_suspendChat::promise_type10     std::suspend_always initial_suspend() { return {}; }
get_return_objectChat::promise_type11     Chat get_return_object() {
12       return std::coroutine_handle<promise_type>::from_promise(*this);
13     }
yield_valueChat::promise_type14     std::suspend_always yield_value(int m) { return {}; }
final_suspendChat::promise_type15     std::suspend_always final_suspend() noexcept { return {}; }
return_valueChat::promise_type16     std::suspend_always return_value(int) { return {}; }
unhandled_exceptionChat::promise_type17     void unhandled_exception() {}
18 
await_transformChat::promise_type19     auto await_transform(int s) {
20       struct awaiter {
21         promise_type *promise;
22         bool await_ready() { return true; }
23         int await_resume() { return promise->message; }
24         void await_suspend(std::coroutine_handle<>) {}
25       };
26 
27       return awaiter{this};
28     }
29     int message;
30   };
31 
32   Chat(std::coroutine_handle<promise_type> promise);
33 
34   std::coroutine_handle<promise_type> handle;
35 };
36 
f(int s)37 Chat f(int s)  {
38   // CHECK:      CoyieldExpr {{.*}} <col:3, col:12>
39   // CHECK-NEXT:   CXXMemberCallExpr {{.*}} <col:3, col:12> {{.*}}
40   // CHECK-NEXT:     MemberExpr {{.*}} <col:3> {{.*}}
41   // CHECK-NEXT:       DeclRefExpr {{.*}} <col:3> {{.*}}
42   // CHECK-NEXT:     ImplicitCastExpr {{.*}} <col:12> {{.*}}
43   // CHECK-NEXT:       DeclRefExpr {{.*}} <col:12> {{.*}}
44   co_yield s;
45   // CHECK:      CoreturnStmt {{.*}} <line:{{.*}}:3, col:13>
46   co_return s;
47   // CHECK:      CoawaitExpr {{.*}} <col:3, col:12> 'int'
48   co_await s;
49 }
50