blob: 846fce6199030d3b16c10091c3392e59c11814a6 [file] [log] [blame]
// Test for C++14 sized deallocation. The operators delete defined below
// should be called only in C++14 mode and above.
// { dg-do run }
extern "C" void abort();
typedef __SIZE_TYPE__ size_t;
#include <new>
bool called;
void operator delete[] (void *p, size_t s) throw()
{
called = true;
operator delete[] (p);
}
void operator delete (void *p, size_t s) throw()
{
called = true;
operator delete (p);
}
void operator delete[] (void *p, size_t s, const std::nothrow_t &) throw()
{
called = true;
operator delete[] (p);
}
void operator delete (void *p, size_t s, const std::nothrow_t &) throw()
{
called = true;
operator delete (p);
}
struct A { ~A(){} };
struct B { };
struct C;
struct D { ~D(){}; D() { throw 1; } };
int main()
{
/* * If the type is complete and if, for the second alternative (delete
array) only, the operand is a pointer to a class type with a
non-trivial destructor or a (possibly multi-dimensional) array
thereof, the function with two parameters is selected.
* Otherwise, it is unspecified which of the two deallocation functions
is selected. */
delete new int;
if (called != (__cplusplus >= 201402L)) abort(); called = false;
delete new A;
if (called != (__cplusplus >= 201402L)) abort(); called = false;
delete[] new A[2];
if (called != (__cplusplus >= 201402L)) abort(); called = false;
delete new B;
if (called != (__cplusplus >= 201402L)) abort(); called = false;
/* N3778 added the sized placement deallocation functions, but the core
language rules don't provide any way they would be called. */
try { new (std::nothrow) D; } catch (int) {}
if (called) abort();
try { new (std::nothrow) D[2]; } catch (int) {}
if (called) abort();
/* Make sure we don't try to use the size of an array that doesn't have a
cookie. */
delete[] new B[2];
if (called) abort();
}