| // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c++20 \ | 
 | // RUN:   -emit-llvm %s -o - -disable-llvm-passes \ | 
 | // RUN:   | FileCheck %s | 
 |  | 
 | #include "Inputs/coroutine.h" | 
 |  | 
 | namespace std { | 
 |     typedef __SIZE_TYPE__ size_t; | 
 |     enum class align_val_t : size_t {}; | 
 | } | 
 |  | 
 | struct task { | 
 |   struct promise_type { | 
 |     auto initial_suspend() { return std::suspend_always{}; } | 
 |     auto final_suspend() noexcept { return std::suspend_always{}; } | 
 |     auto get_return_object() { return task{}; } | 
 |     void unhandled_exception() {} | 
 |     void return_value(int) {} | 
 |   }; | 
 | }; | 
 |  | 
 | // Test the compiler will chose sized deallocation correctly. | 
 | void operator delete(void *ptr, std::size_t size) noexcept; | 
 |  | 
 | // CHECK: define{{.*}}@_Z1fv | 
 | // CHECK: %[[coro_free:.+]] = call{{.*}}@llvm.coro.free | 
 | // CHECK: coro.free: | 
 | // CHECK: %[[coro_size:.+]] = call{{.*}}@llvm.coro.size | 
 | // CHECK: call{{.*}}void @_ZdlPvm(ptr{{.*}}%[[coro_free]], i64{{.*}}%[[coro_size]]) | 
 |  | 
 | task f() { | 
 |   co_return 43; | 
 | } |