(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
torture/
pr48542.c
       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__))
      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__))
      26  void sub(void)
      27  {
      28    called++;
      29  }
      30  
      31  int called3;
      32  __attribute__ ((__noinline__))
      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__))
      45  void sub3(void)
      46  {
      47    called3++;
      48    if (called3 == 10)
      49      longjmp (env, 1);
      50  }
      51  
      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  }