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