xref: /llvm-project/clang/test/AST/ast-dump-coroutine.cpp (revision 7c1d9b15eee3a34678addab2bab66f3020ac0753)
1 // RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -std=c++20 \
2 // RUN:    -ast-dump -ast-dump-filter test | FileCheck %s
3 
4 #include "Inputs/std-coroutine.h"
5 
6 using namespace std;
7 
8 struct Task {
9   struct promise_type {
initial_suspendTask::promise_type10     std::suspend_always initial_suspend() { return {}; }
get_return_objectTask::promise_type11     Task get_return_object() {
12       return std::coroutine_handle<promise_type>::from_promise(*this);
13     }
final_suspendTask::promise_type14     std::suspend_always final_suspend() noexcept { return {}; }
return_voidTask::promise_type15     std::suspend_always return_void() { return {}; }
unhandled_exceptionTask::promise_type16     void unhandled_exception() {}
17 
await_transformTask::promise_type18     auto await_transform(int s) {
19       struct awaiter {
20         promise_type *promise;
21         bool await_ready() { return true; }
22         int await_resume() { return 1; }
23         void await_suspend(std::coroutine_handle<>) {}
24       };
25 
26       return awaiter{this};
27     }
28   };
29 
30   Task(std::coroutine_handle<promise_type> promise);
31 
32   std::coroutine_handle<promise_type> handle;
33 };
34 
test()35 Task test()  {
36   co_await 1;
37 // Writen souce code, verify no implicit bit for the co_await expr.
38 // CHECK:        CompoundStmt {{.*}}
39 // CHECK-NEXT:   | `-ExprWithCleanups {{.*}} 'int'
40 // CHECK-NEXT:   |   `-CoawaitExpr {{.*}} 'int'{{$}}
41 // CHECK-NEXT:   |     |-IntegerLiteral {{.*}} <col:12> 'int' 1
42 // CHECK-NEXT:   |     |-MaterializeTemporaryExpr {{.*}} 'awaiter'
43 // CHECK-NEXT:   |     | `-CXXMemberCallExpr {{.*}} 'awaiter'
44 // CHECK-NEXT:   |     |   |-MemberExpr {{.*}} .await_transform
45 }
46 // Verify the implicit AST nodes for coroutines.
47 // CHECK:        |-DeclStmt {{.*}}
48 // CHECK-NEXT:   | `-VarDecl {{.*}} implicit used __promise
49 // CHECK-NEXT:   |   `-CXXConstructExpr {{.*}}
50 // CHECK-NEXT:   |-ExprWithCleanups {{.*}} 'void'
51 // CHECK-NEXT:   | `-CoawaitExpr {{.*}} 'void' implicit
52 // CHECK-NEXT:       |-CXXMemberCallExpr  {{.*}} 'std::suspend_always'
53 // CHECK-NEXT:       |   | `-MemberExpr {{.*}} .initial_suspend
54 //                   ...
55 // CHECK: CoreturnStmt {{.*}} <col:6> implicit
56 
test2()57 Task test2()  {
58 // Writen souce code, verify no implicit bit for the co_return expr.
59 // CHECK:        CompoundStmt {{.*}}
60 // CHECK-NEXT:   | `-CoreturnStmt {{.*}} <line:{{.*}}:{{.*}}>{{$}}
61   co_return;
62 }
63 // Verify the implicit AST nodes for coroutines.
64 // CHECK:        |-DeclStmt {{.*}}
65 // CHECK-NEXT:   | `-VarDecl {{.*}} implicit used __promise
66 //               ...
67 // CHECK: CoreturnStmt {{.*}} <col:6> implicit
68