// { dg-do compile }
|
// { dg-do compile }
|
// { dg-final { scan-assembler-not "__cxa_get_exception" } }
|
// { dg-final { scan-assembler-not "__cxa_get_exception" } }
|
// { dg-options "-fno-use-cxa-get-exception-ptr" }
|
// { dg-options "-fno-use-cxa-get-exception-ptr" }
|
|
|
#include
|
#include
|
#include
|
#include
|
|
|
|
|
struct Check {
|
struct Check {
|
int obj1, obj2;
|
int obj1, obj2;
|
bool state;
|
bool state;
|
};
|
};
|
|
|
static Check const data[] = {
|
static Check const data[] = {
|
{ 0, 0, false }, // construct [0]
|
{ 0, 0, false }, // construct [0]
|
{ 1, 0, true }, // [1] = [0]
|
{ 1, 0, true }, // [1] = [0]
|
{ 0, 0, true }, // destruct [0]
|
{ 0, 0, true }, // destruct [0]
|
{ 2, 1, true }, // [2] = [1]
|
{ 2, 1, true }, // [2] = [1]
|
{ 2, 2, true }, // destruct [2]
|
{ 2, 2, true }, // destruct [2]
|
{ 3, 1, true }, // [3] = [1]
|
{ 3, 1, true }, // [3] = [1]
|
{ 3, 3, false }, // destruct [3]
|
{ 3, 3, false }, // destruct [3]
|
{ 1, 1, false }, // destruct [1]
|
{ 1, 1, false }, // destruct [1]
|
{ 9, 9, false } // end-of-data
|
{ 9, 9, false } // end-of-data
|
};
|
};
|
|
|
static int pos = 0;
|
static int pos = 0;
|
|
|
static void test(int obj1, int obj2, bool state)
|
static void test(int obj1, int obj2, bool state)
|
{
|
{
|
if (obj1 != data[pos].obj1) abort ();
|
if (obj1 != data[pos].obj1) abort ();
|
if (obj2 != data[pos].obj2) abort ();
|
if (obj2 != data[pos].obj2) abort ();
|
if (state != data[pos].state) abort ();
|
if (state != data[pos].state) abort ();
|
pos++;
|
pos++;
|
}
|
}
|
|
|
|
|
struct S {
|
struct S {
|
int id;
|
int id;
|
S ();
|
S ();
|
S (const S &);
|
S (const S &);
|
~S ();
|
~S ();
|
};
|
};
|
|
|
static int next_id = 0;
|
static int next_id = 0;
|
|
|
S::S()
|
S::S()
|
: id (next_id++)
|
: id (next_id++)
|
{
|
{
|
test (id, id, std::uncaught_exception ());
|
test (id, id, std::uncaught_exception ());
|
}
|
}
|
|
|
S::S(const S &x)
|
S::S(const S &x)
|
: id (next_id++)
|
: id (next_id++)
|
{
|
{
|
test (id, x.id, std::uncaught_exception ());
|
test (id, x.id, std::uncaught_exception ());
|
}
|
}
|
|
|
S::~S()
|
S::~S()
|
{
|
{
|
test (id, id, std::uncaught_exception ());
|
test (id, id, std::uncaught_exception ());
|
}
|
}
|
|
|
extern void foo (S *);
|
extern void foo (S *);
|
|
|
int main()
|
int main()
|
{
|
{
|
try
|
try
|
{
|
{
|
try
|
try
|
{
|
{
|
S s0;
|
S s0;
|
throw s0; // s1 is the exception object
|
throw s0; // s1 is the exception object
|
}
|
}
|
catch (S s2)
|
catch (S s2)
|
{
|
{
|
throw;
|
throw;
|
}
|
}
|
}
|
}
|
catch (S s3)
|
catch (S s3)
|
{
|
{
|
}
|
}
|
|
|
return 0;
|
return 0;
|
}
|
}
|
|
|