1extern void abort (void);
2
3static max;
4
5static void __attribute__((noinline)) storemax (int i)
6{
7  if (i > max)
8    max = i;
9}
10
11static int CallFunctionRec(int (*fun)(int depth), int depth) {
12  if (!fun(depth)) {
13    return 0;
14  }
15  if (depth < 10) {
16    CallFunctionRec(fun, depth + 1);
17  }
18  return 1;
19}
20
21static int CallFunction(int (*fun)(int depth)) {
22  return CallFunctionRec(fun, 1) && !fun(0);
23}
24
25static int callback(int depth) {
26  storemax (depth);
27  return depth != 0;
28}
29
30int main() {
31  CallFunction(callback);
32  if (max != 10)
33    abort ();
34  return 0;
35}
36