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