summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/eh/uncaught2.C
blob: a99b2d7f36e4803bca3fa569afe2c789657fe00a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// { dg-do compile }
// { dg-final { scan-assembler-not "__cxa_get_exception" } }
// { dg-options "-fno-use-cxa-get-exception-ptr" }

#include <exception>
#include <cstdlib>


struct Check {
  int obj1, obj2;
  bool state;
};

static Check const data[] = {
  { 0, 0, false },	// construct [0]
  { 1, 0, true  },	// [1] = [0]
  { 0, 0, true  },	// destruct [0]
  { 2, 1, true  },	// [2] = [1]
  { 2, 2, true  },      // destruct [2]
  { 3, 1, true  },	// [3] = [1]
  { 3, 3, false },	// destruct [3]
  { 1, 1, false },	// destruct [1]
  { 9, 9, false }	// end-of-data
};

static int pos = 0;

static void test(int obj1, int obj2, bool state)
{
  if (obj1 != data[pos].obj1) abort ();
  if (obj2 != data[pos].obj2) abort ();
  if (state != data[pos].state) abort ();
  pos++;
}


struct S {
  int id;
  S ();
  S (const S &);
  ~S ();
};

static int next_id = 0;

S::S()
  : id (next_id++)
{
  test (id, id, std::uncaught_exception ());
}

S::S(const S &x)
  : id (next_id++)
{
  test (id, x.id, std::uncaught_exception ());
}

S::~S()
{
  test (id, id, std::uncaught_exception ());
}

extern void foo (S *);

int main()
{
  try
    {
      try
	{
	  S s0;
	  throw s0;	// s1 is the exception object
	}
      catch (S s2)
	{
	  throw;
	}
    }
  catch (S s3)
    {
    }
 
  return 0;
}