|  | // 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(); | 
|  | } | 
|  |  |