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