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))
sub2(void)12 sub2 (void)
13 {
14   __builtin_longjmp (buf, 1);
15 }
16 
17 int
main()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 }
43