1// { dg-do compile { target powerpc*-*-darwin* } }
2// { dg-final { scan-assembler-not "__cxa_get_exception" } }
3// { dg-options "-mmacosx-version-min=10.4" }
4
5#include <exception>
6#include <cstdlib>
7
8
9struct Check {
10  int obj1, obj2;
11  bool state;
12};
13
14static Check const data[] = {
15  { 0, 0, false },	// construct [0]
16  { 1, 0, true  },	// [1] = [0]
17  { 0, 0, true  },	// destruct [0]
18  { 2, 1, true  },	// [2] = [1]
19  { 2, 2, true  },      // destruct [2]
20  { 3, 1, true  },	// [3] = [1]
21  { 3, 3, false },	// destruct [3]
22  { 1, 1, false },	// destruct [1]
23  { 9, 9, false }	// end-of-data
24};
25
26static int pos = 0;
27
28static void test(int obj1, int obj2, bool state)
29{
30  if (obj1 != data[pos].obj1) abort ();
31  if (obj2 != data[pos].obj2) abort ();
32  if (state != data[pos].state) abort ();
33  pos++;
34}
35
36
37struct S {
38  int id;
39  S ();
40  S (const S &);
41  ~S ();
42};
43
44static int next_id = 0;
45
46S::S()
47  : id (next_id++)
48{
49  test (id, id, std::uncaught_exception ());
50}
51
52S::S(const S &x)
53  : id (next_id++)
54{
55  test (id, x.id, std::uncaught_exception ());
56}
57
58S::~S()
59{
60  test (id, id, std::uncaught_exception ());
61}
62
63extern void foo (S *);
64
65int main()
66{
67  try
68    {
69      try
70	{
71	  S s0;
72	  throw s0;	// s1 is the exception object
73	}
74      catch (S s2)
75	{
76	  throw;
77	}
78    }
79  catch (S s3)
80    {
81    }
82
83  return 0;
84}
85