1 /* Test fegetexceptflag and fesetexceptflag.
2 Copyright (C) 2016-2024 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
21 #include <math-tests.h>
23 /* Like feraiseexcept, but raise exactly the specified exceptions EXC,
24 without possibly raising "inexact" together with "overflow" or
25 "underflow" as permitted by ISO C. (This is not used with traps
26 enabled, so side-effects from raising and then clearing "inexact"
30 feraiseexcept_exact (int exc
)
40 if ((exc
& FE_INEXACT
) != 0
42 || fetestexcept (FE_INEXACT
) != 0)
43 return feraiseexcept (exc
);
44 int ret
= feraiseexcept (exc
);
45 feclearexcept (FE_INEXACT
);
48 return feraiseexcept (exc
);
53 test_set (int initial
, const fexcept_t
*saved
, int mask
, int expected
)
56 feclearexcept (FE_ALL_EXCEPT
);
57 printf ("Testing set: initial exceptions %x, mask %x, expected %x\n",
58 (unsigned int) initial
, (unsigned int) mask
,
59 (unsigned int) expected
);
60 int ret
= feraiseexcept_exact (initial
);
63 puts ("feraiseexcept failed");
64 if (initial
== 0 || EXCEPTION_TESTS (float))
66 puts ("failure of feraiseexcept was unexpected");
70 puts ("failure of feraiseexcept OK, skipping further tests");
73 ret
= fesetexceptflag (saved
, mask
);
76 puts ("fesetexceptflag failed");
80 puts ("fesetexceptflag succeeded");
81 ret
= fetestexcept (FE_ALL_EXCEPT
);
84 printf ("raised exceptions %x, expected %x\n",
85 (unsigned int) ret
, (unsigned int) expected
);
92 test_except (int exc
, const char *exc_name
)
96 printf ("Testing %s\n", exc_name
);
97 feclearexcept (FE_ALL_EXCEPT
);
99 fexcept_t clear_saved_exc
, clear_saved_all
;
100 int ret
= fegetexceptflag (&clear_saved_exc
, exc
);
102 printf ("fegetexceptflag (%s) succeeded\n", exc_name
);
105 printf ("fegetexceptflag (%s) failed\n", exc_name
);
109 ret
= fegetexceptflag (&clear_saved_all
, FE_ALL_EXCEPT
);
111 puts ("fegetexceptflag (FE_ALL_EXCEPT) succeeded");
114 puts ("fegetexceptflag (FE_ALL_EXCEPT) failed");
119 ret
= feraiseexcept_exact (exc
);
121 printf ("feraiseexcept (%s) succeeded\n", exc_name
);
124 printf ("feraiseexcept (%s) failed\n", exc_name
);
125 if (exc
== 0 || EXCEPTION_TESTS (float))
127 puts ("failure of feraiseexcept was unexpected");
131 puts ("failure of feraiseexcept OK, skipping further tests");
135 fexcept_t set_saved_exc
, set_saved_all
;
136 ret
= fegetexceptflag (&set_saved_exc
, exc
);
138 printf ("fegetexceptflag (%s) succeeded\n", exc_name
);
141 printf ("fegetexceptflag (%s) failed\n", exc_name
);
145 ret
= fegetexceptflag (&set_saved_all
, FE_ALL_EXCEPT
);
147 puts ("fegetexceptflag (FE_ALL_EXCEPT) succeeded");
150 puts ("fegetexceptflag (FE_ALL_EXCEPT) failed");
155 result
|= test_set (0, &set_saved_exc
, exc
, exc
);
156 result
|= test_set (0, &set_saved_all
, exc
, exc
);
157 result
|= test_set (0, &set_saved_all
, FE_ALL_EXCEPT
, exc
);
158 result
|= test_set (0, &clear_saved_exc
, exc
, 0);
159 result
|= test_set (0, &clear_saved_all
, exc
, 0);
160 result
|= test_set (0, &clear_saved_all
, FE_ALL_EXCEPT
, 0);
161 result
|= test_set (exc
, &set_saved_exc
, exc
, exc
);
162 result
|= test_set (exc
, &set_saved_all
, exc
, exc
);
163 result
|= test_set (exc
, &set_saved_all
, FE_ALL_EXCEPT
, exc
);
164 result
|= test_set (exc
, &clear_saved_exc
, exc
, 0);
165 result
|= test_set (exc
, &clear_saved_all
, exc
, 0);
166 result
|= test_set (exc
, &clear_saved_all
, FE_ALL_EXCEPT
, 0);
167 result
|= test_set (FE_ALL_EXCEPT
, &set_saved_exc
, exc
, FE_ALL_EXCEPT
);
168 result
|= test_set (FE_ALL_EXCEPT
, &set_saved_all
, exc
, FE_ALL_EXCEPT
);
169 result
|= test_set (FE_ALL_EXCEPT
, &set_saved_all
, FE_ALL_EXCEPT
, exc
);
170 result
|= test_set (FE_ALL_EXCEPT
, &clear_saved_exc
, exc
,
171 FE_ALL_EXCEPT
& ~exc
);
172 result
|= test_set (FE_ALL_EXCEPT
, &clear_saved_all
, exc
,
173 FE_ALL_EXCEPT
& ~exc
);
174 result
|= test_set (FE_ALL_EXCEPT
, &clear_saved_all
, FE_ALL_EXCEPT
, 0);
184 result
|= test_except (0, "0");
185 result
|= test_except (FE_ALL_EXCEPT
, "FE_ALL_EXCEPT");
187 result
|= test_except (FE_DIVBYZERO
, "FE_DIVBYZERO");
190 result
|= test_except (FE_INEXACT
, "FE_INEXACT");
193 result
|= test_except (FE_INVALID
, "FE_INVALID");
196 result
|= test_except (FE_OVERFLOW
, "FE_OVERFLOW");
199 result
|= test_except (FE_UNDERFLOW
, "FE_UNDERFLOW");
205 #define TEST_FUNCTION do_test ()
206 #include "../test-skeleton.c"