]> git.ipfire.org Git - thirdparty/glibc.git/blame - math/test-fesetexcept-traps.c
Refer to C23 in place of C2X in glibc
[thirdparty/glibc.git] / math / test-fesetexcept-traps.c
CommitLineData
5146356f 1/* Test fesetexcept: exception traps enabled.
dff8da6b 2 Copyright (C) 2016-2024 Free Software Foundation, Inc.
5146356f
JM
3 This file is part of the GNU C Library.
4
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.
9
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.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
5a82c748 17 <https://www.gnu.org/licenses/>. */
5146356f
JM
18
19#include <fenv.h>
20#include <stdio.h>
21#include <math-tests.h>
47a9eeb9 22#include <math-barriers.h>
5146356f
JM
23
24static int
25do_test (void)
26{
27 int result = 0;
28
29 fedisableexcept (FE_ALL_EXCEPT);
30 int ret = feenableexcept (FE_ALL_EXCEPT);
31 if (!EXCEPTION_ENABLE_SUPPORTED (FE_ALL_EXCEPT) && (ret == -1))
32 {
33 puts ("feenableexcept (FE_ALL_EXCEPT) not supported, cannot test");
34 return 77;
35 }
36 else if (ret != 0)
37 {
38 puts ("feenableexcept (FE_ALL_EXCEPT) failed");
39 result = 1;
40 return result;
41 }
42
ecb1e722
AZ
43 /* Verify fesetexcept does not cause exception traps. For architectures
44 where setting the exception might result in traps the function should
47a9eeb9
AZ
45 return a nonzero value.
46 Also check if the function does not alter the exception mask. */
5146356f 47 ret = fesetexcept (FE_ALL_EXCEPT);
ecb1e722
AZ
48
49 _Static_assert (!(EXCEPTION_SET_FORCES_TRAP && !EXCEPTION_TESTS(float)),
50 "EXCEPTION_SET_FORCES_TRAP only makes sense if the "
51 "architecture suports exceptions");
47a9eeb9
AZ
52 {
53 int exc_before = fegetexcept ();
54 ret = fesetexcept (FE_ALL_EXCEPT);
55 int exc_after = fegetexcept ();
56 if (exc_before != exc_after)
57 {
58 puts ("fesetexcept (FE_ALL_EXCEPT) changed the exceptions mask");
59 return 1;
60 }
61 }
62
63 /* Execute some floating-point operations, since on some CPUs exceptions
64 triggers a trap only at the next floating-point instruction. */
65 volatile double a = 1.0;
66 volatile double b = a + a;
67 math_force_eval (b);
68 volatile long double al = 1.0L;
69 volatile long double bl = al + al;
70 math_force_eval (bl);
ecb1e722 71
5146356f 72 if (ret == 0)
ecb1e722
AZ
73 {
74 if (EXCEPTION_SET_FORCES_TRAP)
75 {
76 puts ("unexpected fesetexcept success");
77 result = 1;
78 }
79 }
80 else if (!EXCEPTION_SET_FORCES_TRAP)
5146356f
JM
81 {
82 puts ("fesetexcept (FE_ALL_EXCEPT) failed");
83 if (EXCEPTION_TESTS (float))
84 {
85 puts ("failure of fesetexcept was unexpected");
86 result = 1;
87 }
88 else
89 puts ("failure of fesetexcept OK");
90 }
91 feclearexcept (FE_ALL_EXCEPT);
92
93 return result;
94}
95
47a9eeb9 96#include <support/test-driver.c>