Mercurial > hg > CbC > CbC_gcc
view gcc/testsuite/g++.dg/cpp1y/sized-dealloc1.C @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children |
line wrap: on
line source
// 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(); }