122 lines · cpp
1// Tests that the combination of -fcoro-aligned-allocation and -fsized-deallocation works well.2// Test the compiler will chose sized deallocation correctly.3// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c++20 \4// RUN: -fcoro-aligned-allocation -emit-llvm %s -o - -disable-llvm-passes \5// RUN: | FileCheck %s6 7#include "Inputs/coroutine.h"8 9namespace std {10 typedef __SIZE_TYPE__ size_t;11 enum class align_val_t : size_t {};12}13 14struct task {15 struct promise_type {16 auto initial_suspend() { return std::suspend_always{}; }17 auto final_suspend() noexcept { return std::suspend_always{}; }18 auto get_return_object() { return task{}; }19 void unhandled_exception() {}20 void return_value(int) {}21 };22};23 24// CHECK: define{{.*}}@_Z1fv25// CHECK: coro.free:26// CHECK: %[[coro_size:.+]] = call{{.*}}@llvm.coro.size27// CHECK: %[[coro_align:.+]] = call{{.*}}@llvm.coro.align28// CHECK: call{{.*}}void @_ZdlPvmSt11align_val_t(ptr{{.*}}, i64{{.*}}%[[coro_size]], i64{{.*}}%[[coro_align]])29 30task f() {31 co_return 43;32}33 34struct task2 {35 struct promise_type {36 auto initial_suspend() { return std::suspend_always{}; }37 auto final_suspend() noexcept { return std::suspend_always{}; }38 auto get_return_object() { return task2{}; }39 void unhandled_exception() {}40 void return_value(int) {}41 void operator delete(void *ptr);42 };43};44 45// CHECK: define{{.*}}@_Z2f2v46// CHECK: %[[FREE_HANDLE:.+]] = call{{.*}}ptr @llvm.coro.free(47// CHECK: coro.free:48// CHECK: call{{.*}}void @_ZN5task212promise_typedlEPv(ptr{{.*}} %[[FREE_HANDLE]])49 50task2 f2() {51 co_return 43;52}53 54struct task3 {55 struct promise_type {56 auto initial_suspend() { return std::suspend_always{}; }57 auto final_suspend() noexcept { return std::suspend_always{}; }58 auto get_return_object() { return task3{}; }59 void unhandled_exception() {}60 void return_value(int) {}61 void operator delete(void *ptr, std::size_t);62 void operator delete(void *ptr);63 };64};65 66// CHECK: define{{.*}}@_Z2f3v67// CHECK: %[[FREE_HANDLE:.+]] = call{{.*}}ptr @llvm.coro.free(68// CHECK: coro.free:69// CHECK: %[[coro_size:.+]] = call{{.*}}@llvm.coro.size70// CHECK: call{{.*}}void @_ZN5task312promise_typedlEPvm(ptr{{.*}} %[[FREE_HANDLE]], i64{{.*}}%[[coro_size]]71 72task3 f3() {73 co_return 43;74}75 76struct task4 {77 struct promise_type {78 auto initial_suspend() { return std::suspend_always{}; }79 auto final_suspend() noexcept { return std::suspend_always{}; }80 auto get_return_object() { return task4{}; }81 void unhandled_exception() {}82 void return_value(int) {}83 void operator delete(void *ptr, std::size_t);84 void operator delete(void *ptr, std::align_val_t);85 void operator delete(void *ptr);86 };87};88 89// CHECK: define{{.*}}@_Z2f4v90// CHECK: %[[FREE_HANDLE:.+]] = call{{.*}}ptr @llvm.coro.free(91// CHECK: coro.free:92// CHECK: %[[coro_align:.+]] = call{{.*}}@llvm.coro.align93// CHECK: call{{.*}}void @_ZN5task412promise_typedlEPvSt11align_val_t(ptr{{.*}} %[[FREE_HANDLE]], i64{{.*}}%[[coro_align]])94 95task4 f4() {96 co_return 43;97}98 99struct task5 {100 struct promise_type {101 auto initial_suspend() { return std::suspend_always{}; }102 auto final_suspend() noexcept { return std::suspend_always{}; }103 auto get_return_object() { return task5{}; }104 void unhandled_exception() {}105 void return_value(int) {}106 void operator delete(void *ptr, std::size_t);107 void operator delete(void *ptr, std::size_t, std::align_val_t);108 void operator delete(void *ptr);109 };110};111 112// CHECK: define{{.*}}@_Z2f5v113// CHECK: %[[FREE_HANDLE:.+]] = call{{.*}}ptr @llvm.coro.free(114// CHECK: coro.free:115// CHECK: %[[coro_size:.+]] = call{{.*}}@llvm.coro.size116// CHECK: %[[coro_align:.+]] = call{{.*}}@llvm.coro.align117// CHECK: call{{.*}}void @_ZN5task512promise_typedlEPvmSt11align_val_t(ptr{{.*}} %[[FREE_HANDLE]], i64{{.*}}%[[coro_size]], i64{{.*}}%[[coro_align]])118 119task5 f5() {120 co_return 43;121}122