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
24jmp_buf buf1;
25jmp_buf buf2;
26int *p;
27int n_x = 6;
28
29static int g_counter = 0;
30
31int
32f (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 (env: buf1, val: 2);
46 else if (g_counter == 5)
47 longjmp (env: buf1, val: 101);
48 else
49 {
50 _setjmp (buf2);
51 _longjmp (env: buf1, val: 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 (env: buf1, val: 2);
66 else if (g_counter == 5)
67 longjmp (env: buf1, val: 101);
68 else
69 {
70 _setjmp (buf2);
71 _longjmp (env: buf1, val: 101);
72 }
73 }
74 }
75
76 way_point2--;
77
78 if (counter == 1)
79 {
80 counter++;
81 longjmp (env: buf2, val: 2);
82 }
83
84 lose = !(way_point1 == 0 && way_point2 == 0
85 && g_counter == 6 && counter == 2);
86
87 return lose;
88}
89
90static int
91do_test (void)
92{
93 int lose;
94
95 lose = f ();
96
97 if (lose)
98 puts (s: "Test FAILED!");
99 else
100 puts (s: "Test succeeded!");
101
102 return lose ? EXIT_FAILURE : EXIT_SUCCESS;
103}
104
105#define TEST_FUNCTION do_test ()
106#include "../test-skeleton.c"
107

source code of glibc/setjmp/bug269-setjmp.c