12d97f0f2SAmir Ayupov // Test that we can have a statement that throws in hot cold
22d97f0f2SAmir Ayupov // and a landing pad in cold code.
32d97f0f2SAmir Ayupov //
42d97f0f2SAmir Ayupov // Record performance data with no args. Run test with 2 args.
52d97f0f2SAmir Ayupov 
62d97f0f2SAmir Ayupov #include <stdio.h>
72d97f0f2SAmir Ayupov #include <stdint.h>
82d97f0f2SAmir Ayupov 
foo()92d97f0f2SAmir Ayupov int foo()
102d97f0f2SAmir Ayupov {
112d97f0f2SAmir Ayupov   return 0;
122d97f0f2SAmir Ayupov }
132d97f0f2SAmir Ayupov 
bar(int a)142d97f0f2SAmir Ayupov void bar(int a) {
152d97f0f2SAmir Ayupov   if (a > 2 && a % 2)
162d97f0f2SAmir Ayupov     throw new int();
172d97f0f2SAmir Ayupov }
182d97f0f2SAmir Ayupov 
filter_only()192d97f0f2SAmir Ayupov void filter_only(){
202d97f0f2SAmir Ayupov   foo();
212d97f0f2SAmir Ayupov }
222d97f0f2SAmir Ayupov 
main(int argc,char ** argv)232d97f0f2SAmir Ayupov int main(int argc, char **argv)
242d97f0f2SAmir Ayupov {
252d97f0f2SAmir Ayupov   unsigned r = 0;
262d97f0f2SAmir Ayupov 
27*f263a66bSMaksim Panchenko   uint64_t limit = (argc >= 2 ? 10 : 5000);
282d97f0f2SAmir Ayupov   for (uint64_t i = 0; i < limit; ++i) {
292d97f0f2SAmir Ayupov     i += foo();
302d97f0f2SAmir Ayupov     try  {
312d97f0f2SAmir Ayupov       bar(argc);
322d97f0f2SAmir Ayupov       try {
332d97f0f2SAmir Ayupov         if (argc >= 2)
342d97f0f2SAmir Ayupov           throw new int();
352d97f0f2SAmir Ayupov       } catch (...) {
362d97f0f2SAmir Ayupov         printf("catch 2\n");
372d97f0f2SAmir Ayupov         throw new int();
382d97f0f2SAmir Ayupov       }
392d97f0f2SAmir Ayupov     } catch (...) {
402d97f0f2SAmir Ayupov       printf("catch 1\n");
412d97f0f2SAmir Ayupov     }
422d97f0f2SAmir Ayupov   }
432d97f0f2SAmir Ayupov 
442d97f0f2SAmir Ayupov   return 0;
452d97f0f2SAmir Ayupov }
46