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