xref: /llvm-project/clang/test/AST/ast-dump-coroutine.cpp (revision 7c1d9b15eee3a34678addab2bab66f3020ac0753)
1414ea3a7SHaojian Wu // RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -std=c++20 \
2*7c1d9b15SFangrui Song // RUN:    -ast-dump -ast-dump-filter test | FileCheck %s
3414ea3a7SHaojian Wu 
4414ea3a7SHaojian Wu #include "Inputs/std-coroutine.h"
5414ea3a7SHaojian Wu 
6414ea3a7SHaojian Wu using namespace std;
7414ea3a7SHaojian Wu 
8414ea3a7SHaojian Wu struct Task {
9414ea3a7SHaojian Wu   struct promise_type {
initial_suspendTask::promise_type10414ea3a7SHaojian Wu     std::suspend_always initial_suspend() { return {}; }
get_return_objectTask::promise_type11414ea3a7SHaojian Wu     Task get_return_object() {
12414ea3a7SHaojian Wu       return std::coroutine_handle<promise_type>::from_promise(*this);
13414ea3a7SHaojian Wu     }
final_suspendTask::promise_type14414ea3a7SHaojian Wu     std::suspend_always final_suspend() noexcept { return {}; }
return_voidTask::promise_type15414ea3a7SHaojian Wu     std::suspend_always return_void() { return {}; }
unhandled_exceptionTask::promise_type16414ea3a7SHaojian Wu     void unhandled_exception() {}
17414ea3a7SHaojian Wu 
await_transformTask::promise_type18414ea3a7SHaojian Wu     auto await_transform(int s) {
19414ea3a7SHaojian Wu       struct awaiter {
20414ea3a7SHaojian Wu         promise_type *promise;
21414ea3a7SHaojian Wu         bool await_ready() { return true; }
22414ea3a7SHaojian Wu         int await_resume() { return 1; }
23414ea3a7SHaojian Wu         void await_suspend(std::coroutine_handle<>) {}
24414ea3a7SHaojian Wu       };
25414ea3a7SHaojian Wu 
26414ea3a7SHaojian Wu       return awaiter{this};
27414ea3a7SHaojian Wu     }
28414ea3a7SHaojian Wu   };
29414ea3a7SHaojian Wu 
30414ea3a7SHaojian Wu   Task(std::coroutine_handle<promise_type> promise);
31414ea3a7SHaojian Wu 
32414ea3a7SHaojian Wu   std::coroutine_handle<promise_type> handle;
33414ea3a7SHaojian Wu };
34414ea3a7SHaojian Wu 
test()35414ea3a7SHaojian Wu Task test()  {
36414ea3a7SHaojian Wu   co_await 1;
37414ea3a7SHaojian Wu // Writen souce code, verify no implicit bit for the co_await expr.
38414ea3a7SHaojian Wu // CHECK:        CompoundStmt {{.*}}
39414ea3a7SHaojian Wu // CHECK-NEXT:   | `-ExprWithCleanups {{.*}} 'int'
40414ea3a7SHaojian Wu // CHECK-NEXT:   |   `-CoawaitExpr {{.*}} 'int'{{$}}
41414ea3a7SHaojian Wu // CHECK-NEXT:   |     |-IntegerLiteral {{.*}} <col:12> 'int' 1
42414ea3a7SHaojian Wu // CHECK-NEXT:   |     |-MaterializeTemporaryExpr {{.*}} 'awaiter'
43414ea3a7SHaojian Wu // CHECK-NEXT:   |     | `-CXXMemberCallExpr {{.*}} 'awaiter'
44414ea3a7SHaojian Wu // CHECK-NEXT:   |     |   |-MemberExpr {{.*}} .await_transform
45414ea3a7SHaojian Wu }
46414ea3a7SHaojian Wu // Verify the implicit AST nodes for coroutines.
47414ea3a7SHaojian Wu // CHECK:        |-DeclStmt {{.*}}
48414ea3a7SHaojian Wu // CHECK-NEXT:   | `-VarDecl {{.*}} implicit used __promise
49414ea3a7SHaojian Wu // CHECK-NEXT:   |   `-CXXConstructExpr {{.*}}
50414ea3a7SHaojian Wu // CHECK-NEXT:   |-ExprWithCleanups {{.*}} 'void'
51414ea3a7SHaojian Wu // CHECK-NEXT:   | `-CoawaitExpr {{.*}} 'void' implicit
52414ea3a7SHaojian Wu // CHECK-NEXT:       |-CXXMemberCallExpr  {{.*}} 'std::suspend_always'
53414ea3a7SHaojian Wu // CHECK-NEXT:       |   | `-MemberExpr {{.*}} .initial_suspend
54414ea3a7SHaojian Wu //                   ...
559dddb3d5SHaojian Wu // CHECK: CoreturnStmt {{.*}} <col:6> implicit
56414ea3a7SHaojian Wu 
test2()57414ea3a7SHaojian Wu Task test2()  {
58414ea3a7SHaojian Wu // Writen souce code, verify no implicit bit for the co_return expr.
59414ea3a7SHaojian Wu // CHECK:        CompoundStmt {{.*}}
60414ea3a7SHaojian Wu // CHECK-NEXT:   | `-CoreturnStmt {{.*}} <line:{{.*}}:{{.*}}>{{$}}
61414ea3a7SHaojian Wu   co_return;
62414ea3a7SHaojian Wu }
63414ea3a7SHaojian Wu // Verify the implicit AST nodes for coroutines.
64414ea3a7SHaojian Wu // CHECK:        |-DeclStmt {{.*}}
65414ea3a7SHaojian Wu // CHECK-NEXT:   | `-VarDecl {{.*}} implicit used __promise
66414ea3a7SHaojian Wu //               ...
679dddb3d5SHaojian Wu // CHECK: CoreturnStmt {{.*}} <col:6> implicit
68