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