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