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