URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Only display areas with differences |
Details |
Blame |
View Log
Rev 305 |
Rev 338 |
// { dg-do run }
|
// { dg-do run }
|
// Test that a throw in B's constructor destroys the A and frees the memory.
|
// Test that a throw in B's constructor destroys the A and frees the memory.
|
|
|
#include
|
#include
|
#include
|
#include
|
#include
|
#include
|
|
|
struct A {
|
struct A {
|
A();
|
A();
|
~A();
|
~A();
|
};
|
};
|
|
|
struct B {
|
struct B {
|
B (A);
|
B (A);
|
};
|
};
|
|
|
void foo (B*);
|
void foo (B*);
|
|
|
int newed, created;
|
int newed, created;
|
|
|
int main ()
|
int main ()
|
{
|
{
|
newed = 0; // The libraries might call new before main starts.
|
newed = 0; // The libraries might call new before main starts.
|
try {
|
try {
|
foo (new B (A ()));
|
foo (new B (A ()));
|
} catch (...) { }
|
} catch (...) { }
|
|
|
return !(!newed && !created);
|
return !(!newed && !created);
|
}
|
}
|
|
|
A::A() { created = 1; }
|
A::A() { created = 1; }
|
A::~A() { created = 0; }
|
A::~A() { created = 0; }
|
B::B(A) { throw 1; }
|
B::B(A) { throw 1; }
|
void foo (B*) { }
|
void foo (B*) { }
|
|
|
void* operator new (size_t size) throw (std::bad_alloc)
|
void* operator new (size_t size) throw (std::bad_alloc)
|
{
|
{
|
++newed;
|
++newed;
|
return (void *) std::malloc (size);
|
return (void *) std::malloc (size);
|
}
|
}
|
|
|
void operator delete (void *p) throw ()
|
void operator delete (void *p) throw ()
|
{
|
{
|
--newed;
|
--newed;
|
free (p);
|
free (p);
|
}
|
}
|
|
|
|
|
© copyright 1999-2024
OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.