1 
2 extern long foo (long, long, long (*) (long, long));
3 extern long use (long (*) (long, long), long, long);
4 
5 int
main(void)6 main (void)
7 {
8 #ifndef NO_TRAMPOLINES
9   long sum = 0;
10   long i;
11 
12   long nested_0 (long a, long b)
13     {
14       if (a > 2 * b)
15         return a - b;
16       else
17         return b - a;
18     }
19 
20   long nested_1 (long a, long b)
21     {
22       return use (nested_0, b, a) + sum;
23     }
24 
25   long nested_2 (long a, long b)
26     {
27       return nested_1 (b, a);
28     }
29 
30   for (i = 0; i < 10; ++i)
31     {
32       long j;
33 
34       for (j = 0; j < 10; ++j)
35         {
36           long k;
37 
38           for (k = 0; k < 10; ++k)
39             sum += foo (i, j > k ? j - k : k - j, nested_2);
40         }
41     }
42 
43   if ((sum & 0xffffffff) != 0xbecfcbf5)
44     abort ();
45 #endif
46 
47   exit (0);
48 }
49 
50 long
use(long (* func)(long,long),long a,long b)51 use (long (* func)(long, long), long a, long b)
52 {
53   return func (b, a);
54 }
55 
56 long
foo(long a,long b,long (* func)(long,long))57 foo (long a, long b, long (* func) (long, long))
58 {
59   return func (a, b);
60 }
61