1*e903671bSAmir Ayupov #include <stdio.h>
2*e903671bSAmir Ayupov 
3*e903671bSAmir Ayupov class ExcA {};
4*e903671bSAmir Ayupov class ExcB {};
5*e903671bSAmir Ayupov class ExcC {};
6*e903671bSAmir Ayupov class ExcD {};
7*e903671bSAmir Ayupov class ExcE {};
8*e903671bSAmir Ayupov class ExcF {};
9*e903671bSAmir Ayupov class ExcG {};
10*e903671bSAmir Ayupov 
foo(int a)11*e903671bSAmir Ayupov void foo(int a)
12*e903671bSAmir Ayupov {
13*e903671bSAmir Ayupov   if (a > 1)
14*e903671bSAmir Ayupov     throw ExcG();
15*e903671bSAmir Ayupov   else
16*e903671bSAmir Ayupov     throw ExcC();
17*e903671bSAmir Ayupov }
18*e903671bSAmir Ayupov 
filter_only(int a)19*e903671bSAmir Ayupov void filter_only(int a) throw (ExcA, ExcB, ExcC, ExcD, ExcE, ExcF) {
20*e903671bSAmir Ayupov   foo(a);
21*e903671bSAmir Ayupov }
22*e903671bSAmir Ayupov 
never_throws()23*e903671bSAmir Ayupov void never_throws() throw () {
24*e903671bSAmir Ayupov   printf("this statement is cold and should be outlined\n");
25*e903671bSAmir Ayupov }
26*e903671bSAmir Ayupov 
main(int argc,char ** argv)27*e903671bSAmir Ayupov int main(int argc, char **argv)
28*e903671bSAmir Ayupov {
29*e903671bSAmir Ayupov   for(unsigned i = 0; i < 1000000; ++i) {
30*e903671bSAmir Ayupov     try {
31*e903671bSAmir Ayupov       if (argc == 2) {
32*e903671bSAmir Ayupov         never_throws(); // should be cold
33*e903671bSAmir Ayupov       }
34*e903671bSAmir Ayupov       try {
35*e903671bSAmir Ayupov         if (argc == 2) {
36*e903671bSAmir Ayupov           never_throws(); // should be cold
37*e903671bSAmir Ayupov         }
38*e903671bSAmir Ayupov         throw ExcA();
39*e903671bSAmir Ayupov       } catch (ExcA) {
40*e903671bSAmir Ayupov         printf("catch 2\n");
41*e903671bSAmir Ayupov         throw new int();
42*e903671bSAmir Ayupov       }
43*e903671bSAmir Ayupov     } catch (...) {
44*e903671bSAmir Ayupov       printf("catch 1\n");
45*e903671bSAmir Ayupov     }
46*e903671bSAmir Ayupov 
47*e903671bSAmir Ayupov     try {
48*e903671bSAmir Ayupov       try {
49*e903671bSAmir Ayupov         filter_only(argc);
50*e903671bSAmir Ayupov       } catch (ExcC) {
51*e903671bSAmir Ayupov         printf("caught ExcC\n");
52*e903671bSAmir Ayupov       }
53*e903671bSAmir Ayupov     } catch (ExcG) {
54*e903671bSAmir Ayupov       printf("caught ExcG\n");
55*e903671bSAmir Ayupov     }
56*e903671bSAmir Ayupov   }
57*e903671bSAmir Ayupov 
58*e903671bSAmir Ayupov   return 0;
59*e903671bSAmir Ayupov }
60