brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.4 KiB · 281ef5f Raw
120 lines · cpp
1// RUN: %clang_cc1 -triple arm64-apple-macosx -fsyntax-only -verify %s -Wno-ext-cxx-type-aware-allocators -std=c++26    -fsized-deallocation    -faligned-allocation2// RUN: %clang_cc1 -triple arm64-apple-macosx -fsyntax-only -verify %s -Wno-ext-cxx-type-aware-allocators -std=c++26 -fno-sized-deallocation    -faligned-allocation3// RUN: %clang_cc1 -triple arm64-apple-macosx -fsyntax-only -verify %s -Wno-ext-cxx-type-aware-allocators -std=c++26 -fno-sized-deallocation -fno-aligned-allocation4// RUN: %clang_cc1 -triple arm64-apple-macosx -fsyntax-only -verify %s -Wno-ext-cxx-type-aware-allocators -std=c++26    -fsized-deallocation -fno-aligned-allocation5 6namespace std {7  template <class T> struct type_identity {};8  enum class align_val_t : __SIZE_TYPE__ {};9  struct destroying_delete_t { explicit destroying_delete_t() = default; };10}11 12using size_t = __SIZE_TYPE__;13 14struct TestType {};15template <typename T> struct TemplateTestType {};16 17// Valid free declarations18void *operator new(std::type_identity<int>, size_t, std::align_val_t); // #119void *operator new(std::type_identity<int>, size_t, std::align_val_t, TestType&); // #220template <typename T> void *operator new(std::type_identity<T>, size_t, std::align_val_t); // #321template <typename T> void *operator new(std::type_identity<T>, size_t, std::align_val_t, TestType&); // #422template <typename T> void *operator new(std::type_identity<TemplateTestType<T>>, size_t, std::align_val_t, TestType&); // #523template <typename T, typename U> void *operator new(std::type_identity<T>, size_t, std::align_val_t, TemplateTestType<U>&); // #624template <template <typename> class T> void *operator new(std::type_identity<T<int>>, size_t, std::align_val_t); // #725 26void operator delete(std::type_identity<int>, void *, size_t, std::align_val_t); // #827template <typename T> void operator delete(std::type_identity<T>, void *, size_t, std::align_val_t); // #928template <typename T> void operator delete(std::type_identity<TemplateTestType<T>>, void *, size_t, std::align_val_t); // #1029template <template <typename> class T> void operator delete(std::type_identity<T<int>>, void *, size_t, std::align_val_t); // #1130 31typedef std::type_identity<float> TypeIdentityAlias1;32void *operator new(TypeIdentityAlias1, size_t, std::align_val_t); // #1233 34using TypeIdentityAlias2 = std::type_identity<double>;35void *operator new(TypeIdentityAlias2, size_t, std::align_val_t); // #1336 37template <typename T> using TypeIdentityAlias3 = std::type_identity<T>;38template <typename T> void *operator new(TypeIdentityAlias3<T>, size_t, std::align_val_t); // #1439 40template <typename T> void *operator new(T, size_t, std::align_val_t);41// expected-error@-1 {{'operator new' cannot take a dependent type as its 1st parameter}}42 43template <typename T> void operator delete(T, void*, size_t, std::align_val_t);44// expected-error@-1 {{'operator delete' cannot take a dependent type as its 1st parameter}}45 46template <typename T> struct S {47  typedef std::type_identity<T> type_identity;48  typedef size_t size_ty;49  typedef std::align_val_t align_val_ty;50  typedef void *ptr_ty;51};52 53template <typename T> void *operator new(typename S<T>::type_identity, size_t, std::align_val_t);54// expected-error@-1 {{'operator new' cannot take a dependent type as its 1st parameter}}55 56// Invalid type aware declarations57void *operator new(std::type_identity<int>, size_t); 58// expected-error@-1 {{type aware 'operator new' must have at least three parameters}}59void *operator new(std::type_identity<int>, size_t, TestType&);60// expected-error@-1 {{type aware 'operator new' takes type std::align_val_t ('std::align_val_t') as 3rd parameter}}61void operator delete(std::type_identity<int>, void *);62// expected-error@-1 {{type aware 'operator delete' must have at least four parameters}}63void operator delete(std::type_identity<int>, void *, size_t);64// expected-error@-1 {{type aware 'operator delete' must have at least four parameters}}65void operator delete(std::type_identity<int>, void *, std::align_val_t);66// expected-error@-1 {{type aware 'operator delete' must have at least four parameters}}67template <typename T> void operator delete(std::type_identity<T>, void *);68// expected-error@-1 {{type aware 'operator delete' must have at least four parameters}}69template <typename T> void operator delete(std::type_identity<T>, void *, std::align_val_t);70// expected-error@-1 {{type aware 'operator delete' must have at least four parameters}}71template <typename T> void operator delete(std::type_identity<T>, void *, size_t);72// expected-error@-1 {{type aware 'operator delete' must have at least four parameters}}73template <typename T, typename U> void *operator new(std::type_identity<T>, U);74// expected-error@-1 {{type aware 'operator new' must have at least three parameters}}75template <typename T, typename U> void operator delete(std::type_identity<T>, U, size_t, std::align_val_t);76// expected-error@-1 {{type aware 'operator delete' cannot take a dependent type as its 2nd parameter; use 'void *' instead}}77template <typename T, typename U> void operator delete(std::type_identity<T>, void *, U, std::align_val_t);78// expected-error@-1 {{type aware 'operator delete' cannot take a dependent type as its 3rd parameter; use '__size_t' (aka 'unsigned long') instead}}79template <typename T, typename U> void operator delete(std::type_identity<T>, void *, size_t, U);80// expected-error@-1 {{type aware 'operator delete' cannot take a dependent type as its 4th parameter; use 'std::align_val_t' instead}}81template <typename U> void *operator new(std::type_identity<int>, typename S<U>::size_ty, std::align_val_t);82// expected-error@-1 {{type aware 'operator new' cannot take a dependent type as its 2nd parameter; use size_t ('unsigned long') instead}}83template <typename U> void operator delete(std::type_identity<int>, typename S<U>::ptr_ty, size_t, std::align_val_t);84// expected-error@-1 {{type aware 'operator delete' cannot take a dependent type as its 2nd parameter; use 'void *' instead}}85template <typename T, typename U> void *operator new(std::type_identity<T>, typename S<U>::size_ty, std::align_val_t);86// expected-error@-1 {{type aware 'operator new' cannot take a dependent type as its 2nd parameter; use size_t ('unsigned long') instead}}87template <typename T, typename U> void operator delete(std::type_identity<T>, typename S<U>::ptr_ty, size_t, std::align_val_t);88// expected-error@-1 {{type aware 'operator delete' cannot take a dependent type as its 2nd parameter; use 'void *' instead}}89template <typename T, typename U> void operator delete(std::type_identity<T>, void *, size_t, typename S<U>::align_val_ty);90// expected-error@-1 {{type aware 'operator delete' cannot take a dependent type as its 4th parameter; use 'std::align_val_t' instead}}91 92template <typename T> using Alias = T;93template <typename T> using TypeIdentityAlias = std::type_identity<T>;94typedef std::type_identity<double> TypedefAlias;95using UsingAlias = std::type_identity<float>;96void *operator new(Alias<size_t>, std::align_val_t);97template <typename T> void *operator new(Alias<std::type_identity<T>>, Alias<size_t>, std::align_val_t);98void *operator new(Alias<std::type_identity<int>>, size_t, std::align_val_t);99template <typename T> void operator delete(Alias<std::type_identity<T>>, void *, size_t, std::align_val_t);100void operator delete(Alias<std::type_identity<int>>, void *, size_t, std::align_val_t);101 102template <typename T> void *operator new(TypeIdentityAlias<T>, size_t, std::align_val_t);103void *operator new(TypeIdentityAlias<int>, size_t, std::align_val_t);104template <typename T> void operator delete(TypeIdentityAlias<T>, void *, size_t, std::align_val_t);105void operator delete(TypeIdentityAlias<int>, void *, size_t, std::align_val_t);106 107template <typename T> void *operator new(TypedefAlias, size_t, std::align_val_t);108void *operator new(TypedefAlias, size_t, std::align_val_t);109template <typename T> void operator delete(TypedefAlias, void *, size_t, std::align_val_t);110void operator delete(TypedefAlias, void *, size_t, std::align_val_t);111 112template <typename T> void *operator new(UsingAlias, size_t, std::align_val_t);113void *operator new(UsingAlias, size_t, std::align_val_t);114template <typename T> void operator delete(UsingAlias, void *, size_t, std::align_val_t);115void operator delete(UsingAlias, void *, size_t, std::align_val_t);116 117class ForwardDecl;118void *operator new(std::type_identity<ForwardDecl>, size_t, std::align_val_t);119void operator delete(std::type_identity<ForwardDecl>, void*, size_t, std::align_val_t);120