1 // Make sure that we call terminate when a throw() spec is violated even
2 // with -fnothrow-opt.  The function pointers are there to make sure that
3 // the compiler doesn't get clever about optimizing the calls based on
4 // knowledge about the called functions.
5 
6 // { dg-options "-fnothrow-opt" }
7 // { dg-do run }
8 
9 #include <exception>
10 #include <cstdlib>
11 
my_terminate()12 void my_terminate ()
13 {
14   std::exit (0);
15 }
16 
g()17 void g() { throw 1; }
18 void (*p1)() = g;
f()19 void f() throw() { p1(); }
20 void (*p2)() = f;
h()21 void h() { p2(); }
22 
main()23 int main()
24 {
25   std::set_terminate (my_terminate);
26 
27   try { h(); }
28   catch (int) { }
29 
30   return 1;
31 }
32