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 
8 jmp_buf env;
9 extern void sub(void);
10 extern void sub3(void);
11 int called;
12 __attribute__ ((__noinline__))
sjtest()13 int 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__))
sub(void)26 void sub(void)
27 {
28   called++;
29 }
30 
31 int called3;
32 __attribute__ ((__noinline__))
sjtest3()33 int 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__))
sub3(void)45 void sub3(void)
46 {
47   called3++;
48   if (called3 == 10)
49     longjmp (env, 1);
50 }
51 
main(void)52 int main(void)
53 {
54   if (sjtest() != 99 || called != 10)
55     abort();
56   if (sjtest3() != 42 || called3 != 10)
57     abort();
58   exit (0);
59 }
60