1// Test for C++14 sized deallocation. The operators delete defined below 2// should be called only in C++14 mode and above. 3// { dg-do run } 4 5extern "C" void abort(); 6typedef __SIZE_TYPE__ size_t; 7#include <new> 8 9bool called; 10void operator delete[] (void *p, size_t s) throw() 11{ 12 called = true; 13 operator delete[] (p); 14} 15 16void operator delete (void *p, size_t s) throw() 17{ 18 called = true; 19 operator delete (p); 20} 21 22void operator delete[] (void *p, size_t s, const std::nothrow_t &) throw() 23{ 24 called = true; 25 operator delete[] (p); 26} 27 28void operator delete (void *p, size_t s, const std::nothrow_t &) throw() 29{ 30 called = true; 31 operator delete (p); 32} 33 34struct A { ~A(){} }; 35 36struct B { }; 37 38struct C; 39 40struct D { ~D(){}; D() { throw 1; } }; 41 42int main() 43{ 44 /* * If the type is complete and if, for the second alternative (delete 45 array) only, the operand is a pointer to a class type with a 46 non-trivial destructor or a (possibly multi-dimensional) array 47 thereof, the function with two parameters is selected. 48 49 * Otherwise, it is unspecified which of the two deallocation functions 50 is selected. */ 51 delete new int; 52 if (called != (__cplusplus >= 201402L)) abort(); called = false; 53 54 delete new A; 55 if (called != (__cplusplus >= 201402L)) abort(); called = false; 56 57 delete[] new A[2]; 58 if (called != (__cplusplus >= 201402L)) abort(); called = false; 59 60 delete new B; 61 if (called != (__cplusplus >= 201402L)) abort(); called = false; 62 63 /* N3778 added the sized placement deallocation functions, but the core 64 language rules don't provide any way they would be called. */ 65 try { new (std::nothrow) D; } catch (int) {} 66 if (called) abort(); 67 68 try { new (std::nothrow) D[2]; } catch (int) {} 69 if (called) abort(); 70 71 /* Make sure we don't try to use the size of an array that doesn't have a 72 cookie. */ 73 delete[] new B[2]; 74 if (called) abort(); 75} 76