51 lines · cpp
1// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -std=c++20 \2// RUN: -O0 %s -o - | FileCheck %s3// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -std=c++20 \4// RUN: -fno-inline -O0 %s -o - | FileCheck %s5 6namespace std {7 8struct handle {};9 10struct awaitable {11 bool await_ready() noexcept { return true; }12 // CHECK-NOT: await_suspend13 inline void __attribute__((__always_inline__)) await_suspend(handle) noexcept {}14 bool await_resume() noexcept { return true; }15};16 17template <typename T>18struct coroutine_handle {19 static handle from_address(void *address) noexcept { return {}; }20};21 22template <typename T = void>23struct coroutine_traits {24 struct promise_type {25 awaitable initial_suspend() { return {}; }26 awaitable final_suspend() noexcept { return {}; }27 void return_void() {}28 T get_return_object() { return T(); }29 void unhandled_exception() {}30 };31};32} // namespace std33 34// CHECK-LABEL: @_Z3foov35// CHECK-LABEL: entry:36// CHECK: %ref.tmp.reload.addr = getelementptr37// CHECK: %ref.tmp3.reload.addr = getelementptr38void foo() { co_return; }39 40// Check that bar is not inlined even it's marked as always_inline.41 42// CHECK-LABEL: define {{.*}} void @_Z3bazv()43// CHECK: call void @_Z3barv(44__attribute__((__always_inline__)) void bar() {45 co_return;46}47void baz() {48 bar();49 co_return;50}51