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;
}
|