1 /* Test fegetexceptflag and fesetexceptflag: exception traps enabled.
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>
22 #include <math-barriers.h>
29 fedisableexcept (FE_ALL_EXCEPT
);
30 int ret
= feraiseexcept (FE_ALL_EXCEPT
);
33 if (EXCEPTION_TESTS (float))
35 puts ("feraiseexcept (FE_ALL_EXCEPT) failed");
41 puts ("feraiseexcept (FE_ALL_EXCEPT) unsupported, cannot test");
46 ret
= fegetexceptflag (&saved
, FE_ALL_EXCEPT
);
49 puts ("fegetexceptflag failed");
53 feclearexcept (FE_ALL_EXCEPT
);
55 ret
= feenableexcept (FE_ALL_EXCEPT
);
56 if (!EXCEPTION_ENABLE_SUPPORTED (FE_ALL_EXCEPT
) && (ret
== -1))
58 puts ("feenableexcept (FE_ALL_EXCEPT) not supported, cannot test");
63 puts ("feenableexcept (FE_ALL_EXCEPT) failed");
67 /* The test is that this does not cause exception traps. For architectures
68 where setting the exception might result in traps the function should
69 return a nonzero value.
70 Also check if the function does not alter the exception mask. */
71 ret
= fesetexceptflag (&saved
, FE_ALL_EXCEPT
);
73 _Static_assert (!(EXCEPTION_SET_FORCES_TRAP
&& !EXCEPTION_TESTS(float)),
74 "EXCEPTION_SET_FORCES_TRAP only makes sense if the "
75 "architecture suports exceptions");
77 int exc_before
= fegetexcept ();
78 ret
= fesetexceptflag (&saved
, FE_ALL_EXCEPT
);
79 int exc_after
= fegetexcept ();
80 if (exc_before
!= exc_after
)
82 puts ("fesetexceptflag (FE_ALL_EXCEPT) changed the exceptions mask");
87 /* Execute some floating-point operations, since on some CPUs exceptions
88 triggers a trap only at the next floating-point instruction. */
89 volatile double a
= 1.0;
90 volatile double b
= a
+ a
;
92 volatile long double al
= 1.0L;
93 volatile long double bl
= al
+ al
;
96 if (ret
!= 0 && !EXCEPTION_SET_FORCES_TRAP
)
98 puts ("fesetexceptflag failed");
101 feclearexcept (FE_ALL_EXCEPT
);
106 #define TEST_FUNCTION do_test ()
107 #include "../test-skeleton.c"