c: fix ICE when forming composite type for two structures / unions [PR117548]
[official-gcc.git] / gcc / testsuite / g++.dg / eh / delete1.C
blob92ed646ef2cd9814dead8592b069c707e66dcc69
1 // { dg-do run }
2 // { dg-xfail-run-if "AIX operator delete" { powerpc-ibm-aix* } }
4 // pr 55635, the delete operator must be called, regardless of whether
5 // the dtor throws
7 static int deleted;
9 void operator delete (void *) throw ()
11   deleted = 1;
14 struct Foo {
15   ~Foo()
16 #if __cplusplus <= 201402L
17   throw(int)                    // { dg-warning "deprecated" "" { target { c++11 && { ! c++17 } } } }
18 #else
19   noexcept(false)
20 #endif
21   {throw 1;}
24 struct Baz {
25   void operator delete (void *) throw ()
26   {
27     deleted = 2;
28   }
29   virtual ~Baz()
30 #if __cplusplus <= 201402L
31   throw(int)                    // { dg-warning "deprecated" "" { target { c++11 && { ! c++17 } } } }
32 #else
33   noexcept(false)
34 #endif
35   {throw 1;}
38 int non_virt ()
40   deleted = 0;
41   
42   Foo *p = new Foo;
43   try { delete p; }
44   catch (...) { return deleted != 1;}
45   return 1;
48 int virt_glob ()
50   deleted = 0;
51   
52   Baz *p = ::new Baz;
53   try { ::delete p; }
54   catch (...) { return deleted != 1;}
55   return 1;
58 int virt_del ()
60   deleted = 0;
61   
62   Baz *p = new Baz;
63   try { delete p; }
64   catch (...) { return deleted != 2;}
65   return 1;
68 int ary ()
70   deleted = 0;
72   Baz *p = new Baz[1];
73   try { delete[] p; }
74   catch (...) { return deleted != 1;}
75   return 1;
78 int main ()
80   if (non_virt ())
81     return 1;
83   if (virt_glob ())
84     return 2;
86   if (virt_del ())
87     return 3;
89   if (ary ())
90     return 4;
91   
92   return 0;