modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/built-in-setjmp.c (about)

     1  /* { dg-require-effective-target indirect_jumps } */
     2  /* { dg-require-effective-target alloca } */
     3  
     4  extern int strcmp(const char *, const char *);
     5  extern char *strcpy(char *, const char *);
     6  extern void abort(void);
     7  extern void exit(int);
     8  
     9  void *buf[20];
    10  
    11  void __attribute__((noinline))
    12  sub2 (void)
    13  {
    14    __builtin_longjmp (buf, 1);
    15  }
    16  
    17  int
    18  main ()
    19  {
    20    char *p = (char *) __builtin_alloca (20);
    21  
    22    strcpy (p, "test");
    23  
    24    if (__builtin_setjmp (buf))
    25      {
    26        if (strcmp (p, "test") != 0)
    27  	abort ();
    28  
    29        exit (0);
    30      }
    31  
    32    {
    33      int *q = (int *) __builtin_alloca (p[2] * sizeof (int));
    34      int i;
    35      
    36      for (i = 0; i < p[2]; i++)
    37        q[i] = 0;
    38  
    39      while (1)
    40        sub2 ();
    41    }
    42  }