xref: /llvm-project/clang/test/SemaCXX/coroutine-promise-ctor.cpp (revision 498e1c2257da552abc58aa75f6b9f776bf826f86)
1 // RUN: %clang_cc1 -std=c++20 -ast-dump %s | FileCheck %s
2 #include "Inputs/std-coroutine.h"
3 
4 // Github issue: https://github.com/llvm/llvm-project/issues/78290
5 namespace GH78290 {
6 class Gen {
7    public:
8     class promise_type {
9        public:
10         template<typename... Args>
promise_type(Args...)11         explicit promise_type(Args...) {}
12         // CHECK:       CXXConstructorDecl {{.*}} used promise_type 'void ()' {{.*}}
13         // CHECK-NEXT:     TemplateArgument pack
14         // CHECK-NEXT:     CompoundStmt {{.*}}
get_return_object()15         Gen get_return_object() { return {}; }
16 
unhandled_exception()17         void unhandled_exception() {}
return_void()18         void return_void() {}
await_transform(Gen gen)19         std::suspend_always await_transform(Gen gen) { return {}; }
20 
initial_suspend()21         std::suspend_always initial_suspend() { return {}; }
22         // CHECK: CXXMethodDecl {{.*}} used initial_suspend {{.*}}
final_suspend()23         std::suspend_always final_suspend() noexcept { return {}; }
24         // CHECK: CXXMethodDecl {{.*}} used final_suspend {{.*}}
25     };
26 };
27 
CoroutineBody()28 Gen CoroutineBody() {
29     if constexpr (0) {
30         co_await Gen{};
31     }
32     co_await Gen{};
33 }
34 } // namespace GH78290
35