1 // { dg-do run }
2 // check cleanup of partial array objects
3 extern "C" void abort (void);
4 extern "C" void exit (int);
5
6 int ctor = 0;
7 int dtor = 0;
8
9 int cnt = 1;
10
11 struct A {
12 int x;
13 A();
14 A(const A&);
15 ~A();
16 };
17
A()18 A::A()
19 {
20 if (cnt == 10)
21 throw 57;
22 x = cnt++;
23 ctor++;
24 }
25
A(const A &)26 A::A(const A&)
27 {
28 if (cnt == 10)
29 throw 57;
30 x = cnt++;
31 ctor++;
32 }
33
~A()34 A::~A()
35 {
36 if (x + 1 != cnt--)
37 abort();
38 dtor++;
39 }
40
f()41 void f()
42 {
43 A a[] = {A(), A(), A(), A(), A(), A(), A(), A(), A(), A(), A(), A()};
44
45 throw -1066;
46 }
47
48 int
main()49 main()
50 {
51 int flag;
52
53 flag = 0;
54 try {
55 f();
56 }
57 catch (int) {
58 flag = 1;
59 }
60 if (!flag)
61 abort();
62 if (ctor != 9)
63 abort();
64 if (dtor != 9)
65 abort();
66
67 exit(0);
68 }
69