1/* { dg-do run } */
2/* { dg-require-effective-target indirect_jumps } */
3
4/* The return-address was clobbered.  */
5#include <stdlib.h>
6#include <setjmp.h>
7
8jmp_buf env;
9extern void sub(void);
10extern void sub3(void);
11int called;
12__attribute__ ((__noinline__))
13int sjtest()
14{
15  int i;
16  if (setjmp(env))
17    return 99;
18
19  for (i = 0; i < 10; i++)
20    sub();
21
22  longjmp(env, 1);
23}
24
25__attribute__ ((__noinline__))
26void sub(void)
27{
28  called++;
29}
30
31int called3;
32__attribute__ ((__noinline__))
33int sjtest3()
34{
35  int i;
36  if (setjmp(env))
37    return 42;
38
39  for (i = 0; i < 10; i++)
40    sub3();
41  return 0;
42}
43
44__attribute__ ((__noinline__))
45void sub3(void)
46{
47  called3++;
48  if (called3 == 10)
49    longjmp (env, 1);
50}
51
52int main(void)
53{
54  if (sjtest() != 99 || called != 10)
55    abort();
56  if (sjtest3() != 42 || called3 != 10)
57    abort();
58  exit (0);
59}
60