// An end-to-end test to make sure coroutine passes are added for thinlto. // REQUIRES: x86-registered-target // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c++23 -ffat-lto-objects -flto=thin -emit-llvm %s -O3 -o - \ // RUN: | FileCheck %s #include "Inputs/coroutine.h" class BasicCoroutine { public: struct Promise { BasicCoroutine get_return_object() { return BasicCoroutine {}; } void unhandled_exception() noexcept { } void return_void() noexcept { } std::suspend_never initial_suspend() noexcept { return {}; } std::suspend_never final_suspend() noexcept { return {}; } }; using promise_type = Promise; }; // COM: match the embedded module, so we don't match something in it by accident. // CHECK: @llvm.embedded.object = {{.*}} // CHECK: @llvm.compiler.used = {{.*}} BasicCoroutine coro() { // CHECK: define {{.*}} void @_Z4corov() {{.*}} { // CHECK-NEXT: entry: // CHECK-NEXT: ret void // CHECK-NEXT: } co_return; } int main() { // CHECK: define {{.*}} i32 @main() {{.*}} { // CHECK-NEXT: entry: // CHECK-NEXT: tail call void @_Z4corov() // CHECK-NEXT: ret i32 0 // CHECK-NEXT: } coro(); }