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  }