parent
271167f113
commit
d19cb53b51
|
@ -1,3 +1,7 @@
|
|||
2009-07-16 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* g++.dg/opt/eh4.C: New test.
|
||||
|
||||
2009-07-16 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* obj-c++.dg/defs.mm (abort): Make it extern "C".
|
||||
|
|
|
@ -0,0 +1,59 @@
|
|||
// { dg-do run }
|
||||
// { dg-options "-O3" }
|
||||
|
||||
// Make sure that the call to terminate within F2 is not eliminated
|
||||
// by incorrect MUST_NOT_THROW optimization. Note that we expect F1
|
||||
// to be inlined into F2 in order to expose this case.
|
||||
|
||||
#include <cstdlib>
|
||||
#include <exception>
|
||||
|
||||
static volatile int zero = 0;
|
||||
|
||||
// Note that we need F0 to not be marked nothrow, though we don't actually
|
||||
// want a throw to happen at runtime here. The noinline tag is merely to
|
||||
// make sure the assembly in F0 is not unnecessarily complex.
|
||||
static void __attribute__((noinline)) f0()
|
||||
{
|
||||
if (zero != 0)
|
||||
throw 0;
|
||||
}
|
||||
|
||||
struct S1
|
||||
{
|
||||
S1() { }
|
||||
~S1() { f0(); }
|
||||
};
|
||||
|
||||
static void f1()
|
||||
{
|
||||
S1 s1;
|
||||
throw 1;
|
||||
}
|
||||
|
||||
struct S2
|
||||
{
|
||||
S2() { }
|
||||
~S2() { f1(); }
|
||||
};
|
||||
|
||||
static void __attribute__((noinline)) f2()
|
||||
{
|
||||
S2 s2;
|
||||
throw 2;
|
||||
}
|
||||
|
||||
static void pass()
|
||||
{
|
||||
exit (0);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
std::set_terminate (pass);
|
||||
try {
|
||||
f2();
|
||||
} catch (...) {
|
||||
}
|
||||
abort ();
|
||||
}
|
Loading…
Reference in New Issue