1 // RUN: %clang_cc1 -std=c++1z -verify %s 2 3 using size_t = decltype(sizeof(0)); 4 namespace std { enum class align_val_t : size_t {}; } 5 6 // Aligned version is preferred over unaligned version, 7 // unsized version is preferred over sized version. 8 template<unsigned Align> 9 struct alignas(Align) A { 10 void operator delete(void*); 11 void operator delete(void*, std::align_val_t) = delete; // expected-note {{here}} 12 13 void operator delete(void*, size_t) = delete; 14 void operator delete(void*, size_t, std::align_val_t) = delete; 15 }; f(A<__STDCPP_DEFAULT_NEW_ALIGNMENT__> * p)16void f(A<__STDCPP_DEFAULT_NEW_ALIGNMENT__> *p) { delete p; } f(A<__STDCPP_DEFAULT_NEW_ALIGNMENT__ * 2> * p)17void f(A<__STDCPP_DEFAULT_NEW_ALIGNMENT__ * 2> *p) { delete p; } // expected-error {{deleted}} 18 19 template<unsigned Align> 20 struct alignas(Align) B { 21 void operator delete(void*, size_t); 22 void operator delete(void*, size_t, std::align_val_t) = delete; // expected-note {{here}} 23 }; f(B<__STDCPP_DEFAULT_NEW_ALIGNMENT__> * p)24void f(B<__STDCPP_DEFAULT_NEW_ALIGNMENT__> *p) { delete p; } f(B<__STDCPP_DEFAULT_NEW_ALIGNMENT__ * 2> * p)25void f(B<__STDCPP_DEFAULT_NEW_ALIGNMENT__ * 2> *p) { delete p; } // expected-error {{deleted}} 26