1 /* Copyright (C) 2004-2022 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3 
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8 
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13 
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, see
16    <https://www.gnu.org/licenses/>.  */
17 
18 /* Test case for Bugzilla # 269 */
19 
20 #include <stdio.h>
21 #include <setjmp.h>
22 #include <stdlib.h>
23 
24 jmp_buf buf1;
25 jmp_buf buf2;
26 int *p;
27 int n_x = 6;
28 
29 static int g_counter = 0;
30 
31 int
f(void)32 f (void)
33 {
34   static int counter = 0;
35   static int way_point1 = 3;
36   static int way_point2 = 2;
37   int lose = 0;
38 
39   if (setjmp (buf1) != 101)
40     {
41       int a[n_x];		/* reallocate stack space */
42       g_counter++;
43       p = &a[0];
44       if (g_counter < 5)
45 	longjmp (buf1, 2);
46       else if (g_counter == 5)
47 	longjmp (buf1, 101);
48       else
49 	{
50 	  _setjmp (buf2);
51 	  _longjmp (buf1, 101);
52 	}
53     }
54 
55   way_point1--;
56 
57   if (counter == 0)
58     {
59       counter++;
60       {
61 	int a[n_x];		/* reallocate stack space */
62 	g_counter++;
63 	p = &a[0];
64 	if (g_counter < 5)
65 	  longjmp (buf1, 2);
66 	else if (g_counter == 5)
67 	  longjmp (buf1, 101);
68 	else
69 	  {
70 	    _setjmp (buf2);
71 	    _longjmp (buf1, 101);
72 	  }
73       }
74     }
75 
76   way_point2--;
77 
78   if (counter == 1)
79     {
80       counter++;
81       longjmp (buf2, 2);
82     }
83 
84   lose = !(way_point1 == 0 && way_point2 == 0
85 	   && g_counter == 6 && counter == 2);
86 
87   return lose;
88 }
89 
90 static int
do_test(void)91 do_test (void)
92 {
93   int lose;
94 
95   lose = f ();
96 
97   if (lose)
98     puts ("Test FAILED!");
99   else
100     puts ("Test succeeded!");
101 
102   return lose ? EXIT_FAILURE : EXIT_SUCCESS;
103 }
104 
105 #define TEST_FUNCTION do_test ()
106 #include "../test-skeleton.c"
107