1 // RUN: %clang_cc1 -std=c++20 -triple=x86_64-unknown-linux-gnu -emit-llvm %s -o - -disable-llvm-passes | FileCheck %s
2 
3 #include "Inputs/coroutine.h"
4 
5 struct coro1 {
6   struct promise_type {
7     coro1 get_return_object();
8     std::suspend_never initial_suspend();
9     std::suspend_never final_suspend() noexcept;
10     void return_void();
11   };
12 };
13 
14 coro1 f() {
15   co_await std::suspend_never{};
16 }
17 
18 // CHECK-LABEL: define{{.*}} void @_Z1fv(
19 // CHECK: call void @_ZNSt13suspend_never12await_resumeEv(%"struct.std::suspend_never"*
20 // CHECK: call void @_ZN5coro112promise_type11return_voidEv(%"struct.coro1::promise_type"* {{[^,]*}} %__promise)
21 
22 struct A {
23   A();
24   ~A();
25 };
26 
27 coro1 f2() {
28   co_return (void) A{};
29 }
30 
31 // CHECK-LABEL: define{{.*}} void @_Z2f2v(
32 // CHECK: call void @_ZN1AC1Ev(%struct.A* {{[^,]*}} %[[AVar:.*]])
33 // CHECK-NEXT: call void @_ZN1AD1Ev(%struct.A* {{[^,]*}} %[[AVar]])
34 // CHECK-NEXT: call void @_ZN5coro112promise_type11return_voidEv(%"struct.coro1::promise_type"*
35 
36 struct coro2 {
37   struct promise_type {
38     coro2 get_return_object();
39     std::suspend_never initial_suspend();
40     std::suspend_never final_suspend() noexcept;
41     void return_value(int);
42   };
43 };
44 
45 coro2 g() {
46   co_return 42;
47 }
48 
49 // CHECK-LABEL: define{{.*}} void @_Z1gv(
50 // CHECK: call void @_ZNSt13suspend_never12await_resumeEv(%"struct.std::suspend_never"*
51 // CHECK: call void @_ZN5coro212promise_type12return_valueEi(%"struct.coro2::promise_type"* {{[^,]*}} %__promise, i32 noundef 42)
52