diff options
Diffstat (limited to 'gcc/testsuite/gcc.c-torture/execute/pr42231.c')
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/pr42231.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr42231.c b/gcc/testsuite/gcc.c-torture/execute/pr42231.c new file mode 100644 index 000000000..2e46f5f36 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr42231.c @@ -0,0 +1,35 @@ +extern void abort (void); + +static max; + +static void __attribute__((noinline)) storemax (int i) +{ + if (i > max) + max = i; +} + +static int CallFunctionRec(int (*fun)(int depth), int depth) { + if (!fun(depth)) { + return 0; + } + if (depth < 10) { + CallFunctionRec(fun, depth + 1); + } + return 1; +} + +static int CallFunction(int (*fun)(int depth)) { + return CallFunctionRec(fun, 1) && !fun(0); +} + +static int callback(int depth) { + storemax (depth); + return depth != 0; +} + +int main() { + CallFunction(callback); + if (max != 10) + abort (); + return 0; +} |