1/* { dg-require-effective-target indirect_jumps } */
2/* { dg-require-effective-target alloca } */
3
4extern int strcmp(const char *, const char *);
5extern char *strcpy(char *, const char *);
6extern void abort(void);
7extern void exit(int);
8
9void *buf[20];
10
11void __attribute__((noinline))
12sub2 (void)
13{
14  __builtin_longjmp (buf, 1);
15}
16
17int
18main ()
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}
43