xref: /llvm-project/clang/test/CodeGenCoroutines/coro-only-destroy-when-complete.cpp (revision b7b5907b56e98719b1dba8364ebcfb264fc09bfe)
1 // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c++20 \
2 // RUN:     -disable-llvm-passes -emit-llvm %s -o - | FileCheck %s
3 
4 // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c++20 \
5 // RUN:     -O3 -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK-O
6 
7 #include "Inputs/coroutine.h"
8 
9 using namespace std;
10 
11 struct A;
12 struct A_promise_type {
13   A get_return_object();
14   suspend_always initial_suspend();
15   suspend_always final_suspend() noexcept;
16   void return_value(int);
17   void unhandled_exception();
18 
19   std::coroutine_handle<> handle;
20 };
21 
22 struct Awaitable{
23   bool await_ready();
24   int await_resume();
25   template <typename F>
26   void await_suspend(F);
27 };
28 Awaitable something();
29 
30 struct dtor {
31     dtor();
32     ~dtor();
33 };
34 
35 struct [[clang::coro_only_destroy_when_complete]] A {
36   using promise_type = A_promise_type;
37   A();
38   A(std::coroutine_handle<>);
39   ~A();
40 
41   std::coroutine_handle<promise_type> handle;
42 };
43 
foo()44 A foo() {
45     dtor d;
46     co_await something();
47     dtor d1;
48     co_await something();
49     dtor d2;
50     co_return 43;
51 }
52 
53 // CHECK: define{{.*}}@_Z3foov({{.*}}) #[[ATTR_NUM:[0-9]+]]
54 // CHECK: attributes #[[ATTR_NUM]] = {{.*}}coro_only_destroy_when_complete
55 
56 // CHECK-O: define{{.*}}@_Z3foov.destroy
57 // CHECK-O: {{^.*}}:
58 // CHECK-O-NOT: br
59 // CHECK-O: ret void
60