1 /* { dg-require-effective-target trampolines } */
2 
3 extern long foo (long, long, long (*) (long, long));
4 extern long use (long (*) (long, long), long, long);
5 
6 int
main(void)7 main (void)
8 {
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 
46   exit (0);
47 }
48 
49 long
use(long (* func)(long,long),long a,long b)50 use (long (* func)(long, long), long a, long b)
51 {
52   return func (b, a);
53 }
54 
55 long
foo(long a,long b,long (* func)(long,long))56 foo (long a, long b, long (* func) (long, long))
57 {
58   return func (a, b);
59 }
60