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
       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
      50  use (long (* func)(long, long), long a, long b)
      51  {
      52    return func (b, a);
      53  }
      54  
      55  long
      56  foo (long a, long b, long (* func) (long, long))
      57  {
      58    return func (a, b);
      59  }