// RUN: %clang_cc1 -triple x86_64-apple-darwin9 %s -std=c++20 \ // RUN: -ast-dump | FileCheck %s #include "Inputs/std-coroutine.h" using namespace std; struct Chat { struct promise_type { std::suspend_always initial_suspend() { return {}; } Chat get_return_object() { return std::coroutine_handle::from_promise(*this); } std::suspend_always yield_value(int m) { return {}; } std::suspend_always final_suspend() noexcept { return {}; } std::suspend_always return_value(int) { return {}; } void unhandled_exception() {} auto await_transform(int s) { struct awaiter { promise_type *promise; bool await_ready() { return true; } int await_resume() { return promise->message; } void await_suspend(std::coroutine_handle<>) {} }; return awaiter{this}; } int message; }; Chat(std::coroutine_handle promise); std::coroutine_handle handle; }; Chat f(int s) { // CHECK: CoyieldExpr {{.*}} // CHECK-NEXT: CXXMemberCallExpr {{.*}} {{.*}} // CHECK-NEXT: MemberExpr {{.*}} {{.*}} // CHECK-NEXT: DeclRefExpr {{.*}} {{.*}} // CHECK-NEXT: ImplicitCastExpr {{.*}} {{.*}} // CHECK-NEXT: DeclRefExpr {{.*}} {{.*}} co_yield s; // CHECK: CoreturnStmt {{.*}} co_return s; // CHECK: CoawaitExpr {{.*}} 'int' co_await s; }