cp/
[official-gcc.git] / gcc / testsuite / g++.dg / eh / delete1.C
blob43d7bc077f0ac967dabc49ea0edf703d8250f54c
1 // { dg-do run }
2 // pr 55635, the delete operator must be called, regardless of whether
3 // the dtor throws
5 static int deleted;
7 void operator delete (void *) throw ()
9   deleted = 1;
12 struct Foo {
13   ~Foo() throw(int) {throw 1;}
16 struct Baz {
17   void operator delete (void *) throw ()
18   {
19     deleted = 2;
20   }
21   virtual ~Baz() throw(int) {throw 1;}
24 int non_virt ()
26   deleted = 0;
27   
28   Foo *p = new Foo;
29   try { delete p; }
30   catch (...) { return deleted != 1;}
31   return 1;
34 int virt_glob ()
36   deleted = 0;
37   
38   Baz *p = ::new Baz;
39   try { ::delete p; }
40   catch (...) { return deleted != 1;}
41   return 1;
44 int virt_del ()
46   deleted = 0;
47   
48   Baz *p = new Baz;
49   try { delete p; }
50   catch (...) { return deleted != 2;}
51   return 1;
54 int ary ()
56   deleted = 0;
58   Baz *p = new Baz[5];
59   try { delete[] p; }
60   catch (...) { return deleted != 1;}
61   return 1;
64 int main ()
66   if (non_virt ())
67     return 1;
69   if (virt_glob ())
70     return 2;
72   if (virt_del ())
73     return 3;
75   if (ary ())
76     return 4;
77   
78   return 0;