// { 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 #include 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 (); }