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()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__)) sub(void)26void sub(void) 27 { 28 called++; 29 } 30 31 int called3; 32 __attribute__ ((__noinline__)) sjtest3()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__)) sub3(void)45void sub3(void) 46 { 47 called3++; 48 if (called3 == 10) 49 longjmp (env, 1); 50 } 51 main(void)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