File: sized-dealloc1.C

package info (click to toggle)
gcc-arm-none-eabi 15%3A14.2.rel1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,099,328 kB
  • sloc: cpp: 3,627,108; ansic: 2,571,498; ada: 834,230; f90: 235,082; makefile: 79,231; asm: 74,984; xml: 51,692; exp: 39,736; sh: 33,298; objc: 15,629; python: 15,069; fortran: 14,429; pascal: 7,003; awk: 5,070; perl: 3,106; ml: 285; lisp: 253; lex: 204; haskell: 135
file content (75 lines) | stat: -rw-r--r-- 1,894 bytes parent folder | download | duplicates (10)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// 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();
}