1*2d97f0f2SAmir Ayupov // Test that we can have a statement that throws in hot cold
2*2d97f0f2SAmir Ayupov // and a landing pad in cold code.
3*2d97f0f2SAmir Ayupov //
4*2d97f0f2SAmir Ayupov // Record performance data with no args. Run test with 2 args.
5*2d97f0f2SAmir Ayupov 
6*2d97f0f2SAmir Ayupov #include <stdio.h>
7*2d97f0f2SAmir Ayupov #include <stdint.h>
8*2d97f0f2SAmir Ayupov 
9*2d97f0f2SAmir Ayupov int foo()
10*2d97f0f2SAmir Ayupov {
11*2d97f0f2SAmir Ayupov   return 0;
12*2d97f0f2SAmir Ayupov }
13*2d97f0f2SAmir Ayupov 
14*2d97f0f2SAmir Ayupov void bar(int a) {
15*2d97f0f2SAmir Ayupov   if (a > 2 && a % 2)
16*2d97f0f2SAmir Ayupov     throw new int();
17*2d97f0f2SAmir Ayupov }
18*2d97f0f2SAmir Ayupov 
19*2d97f0f2SAmir Ayupov void filter_only(){
20*2d97f0f2SAmir Ayupov   foo();
21*2d97f0f2SAmir Ayupov }
22*2d97f0f2SAmir Ayupov 
23*2d97f0f2SAmir Ayupov int main(int argc, char **argv)
24*2d97f0f2SAmir Ayupov {
25*2d97f0f2SAmir Ayupov   unsigned r = 0;
26*2d97f0f2SAmir Ayupov 
27*2d97f0f2SAmir Ayupov   uint64_t limit = (argc >= 2 ? 10 : 500000000);
28*2d97f0f2SAmir Ayupov   for (uint64_t i = 0; i < limit; ++i) {
29*2d97f0f2SAmir Ayupov     i += foo();
30*2d97f0f2SAmir Ayupov     try  {
31*2d97f0f2SAmir Ayupov       bar(argc);
32*2d97f0f2SAmir Ayupov       try {
33*2d97f0f2SAmir Ayupov         if (argc >= 2)
34*2d97f0f2SAmir Ayupov           throw new int();
35*2d97f0f2SAmir Ayupov       } catch (...) {
36*2d97f0f2SAmir Ayupov         printf("catch 2\n");
37*2d97f0f2SAmir Ayupov         throw new int();
38*2d97f0f2SAmir Ayupov       }
39*2d97f0f2SAmir Ayupov     } catch (...) {
40*2d97f0f2SAmir Ayupov       printf("catch 1\n");
41*2d97f0f2SAmir Ayupov     }
42*2d97f0f2SAmir Ayupov   }
43*2d97f0f2SAmir Ayupov 
44*2d97f0f2SAmir Ayupov   return 0;
45*2d97f0f2SAmir Ayupov }
46