brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.6 KiB · 3a61622 Raw
115 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -Wno-ext-cxx-type-aware-allocators -verify %s -DNO_TADD -std=c++26    -fsized-deallocation    -faligned-allocation2// RUN: %clang_cc1 -fsyntax-only -Wno-ext-cxx-type-aware-allocators -verify %s -DNO_TADD -std=c++26 -fno-sized-deallocation    -faligned-allocation3// RUN: %clang_cc1 -fsyntax-only -Wno-ext-cxx-type-aware-allocators -verify %s -DNO_TADD -std=c++26 -fno-sized-deallocation -fno-aligned-allocation4// RUN: %clang_cc1 -fsyntax-only -Wno-ext-cxx-type-aware-allocators -verify %s -DNO_TADD -std=c++26    -fsized-deallocation -fno-aligned-allocation5namespace std {6  template <class T> struct type_identity {7    typedef T type;8  };9  enum class align_val_t : __SIZE_TYPE__ {};10  struct destroying_delete_t { explicit destroying_delete_t() = default; };11}12 13using size_t = __SIZE_TYPE__;14 15 16template <class Tp> struct is_const {17  static const bool value = false;18};19template <class Tp> struct is_const<Tp const> {20  static const bool value = true;21};22 23template <class Tp> struct is_volatile {24  static const bool value = false;25};26template <class Tp> struct is_volatile<Tp volatile> {27  static const bool value = true;28};29 30template <class T> static const bool is_const_v = is_const<T>::value;31template <class T> static const bool is_volatile_v = is_volatile<T>::value;32 33struct VerifyQualifiers {34  template <typename T> void *operator new(std::type_identity<T>, size_t, std::align_val_t) throw() {35    static_assert(is_const_v<T> == false); // #136    static_assert(is_volatile_v<T> == false); // #237    return 0;38  }39  template <typename T> void operator delete(std::type_identity<T>, void*, size_t, std::align_val_t) {40    static_assert(is_const_v<T> == false); // #341    static_assert(is_volatile_v<T> == false); // #442  }43  template <typename T> void *operator new(std::type_identity<_Atomic T>, size_t, std::align_val_t) throw() {44    static_assert(is_const_v<T> == false);45    static_assert(is_volatile_v<T> == false);46  }47};48 49void *operator new(std::type_identity<VerifyQualifiers> type, size_t, std::align_val_t) throw() { // #1150  static_assert(is_const_v<typename decltype(type)::type> == false); // #551  static_assert(is_volatile_v<typename decltype(type)::type> == false); // #652  return 0;53}54 55void operator delete(std::type_identity<VerifyQualifiers> type, void*, size_t, std::align_val_t) {56  static_assert(is_const_v<typename decltype(type)::type> == false); // #757  static_assert(is_volatile_v<typename decltype(type)::type> == false); // #858}59 60void *operator new(std::type_identity<int>, size_t, std::align_val_t) throw() = delete; // #1261void operator delete(std::type_identity<int>, void*, size_t, std::align_val_t) = delete;62 63struct TestAtomic1 {64 65};66struct TestAtomic2 {67};68 69void *operator new(std::type_identity<TestAtomic1>, size_t, std::align_val_t) throw() = delete; // #1370void operator delete(std::type_identity<_Atomic TestAtomic1>, void*, size_t, std::align_val_t) = delete; // #971void *operator new(std::type_identity<_Atomic TestAtomic2>, size_t, std::align_val_t) = delete; // #1072void operator delete(std::type_identity<TestAtomic2>, void*, size_t, std::align_val_t) = delete;73 74// Success tests75void test_member_allocators() {76  auto *unqualified_obj = new VerifyQualifiers();77  delete unqualified_obj;78  auto *const_obj = new const VerifyQualifiers();79  delete const_obj;80  auto *volatile_obj = new volatile VerifyQualifiers();81  delete volatile_obj;82  auto *const_volatile_obj = new const volatile VerifyQualifiers();83  delete const_volatile_obj;84  auto *atomic_obj = new _Atomic VerifyQualifiers();85  delete atomic_obj;86  auto *atomic_test1 = new _Atomic TestAtomic1;87  delete atomic_test1;88  // expected-error@-1 {{attempt to use a deleted function}}89  // expected-note@#9 {{'operator delete' has been explicitly marked deleted here}}90  auto *atomic_test2 = new _Atomic TestAtomic2;91  // expected-error@-1 {{call to deleted function 'operator new'}}92  // expected-note@#10 {{candidate function has been explicitly deleted}}93  // expected-note@#11 {{candidate function not viable}}94  // expected-note@#12 {{candidate function not viable}}95  // expected-note@#13 {{candidate function not viable}}96  delete atomic_test2;97}98 99 100 101void test_global_allocators() {102  auto *unqualified_obj = ::new VerifyQualifiers();103  ::delete unqualified_obj;104  auto *const_obj = ::new const VerifyQualifiers();105  ::delete const_obj;106  auto *volatile_obj = ::new volatile VerifyQualifiers();107  ::delete volatile_obj;108  auto *const_volatile_obj = ::new const volatile VerifyQualifiers();109  ::delete const_volatile_obj;110  _Atomic VerifyQualifiers *atomic_obj = ::new _Atomic VerifyQualifiers();111  ::delete atomic_obj;112  _Atomic int *atomic_int = new _Atomic int;113  delete atomic_int;114}115