1 /* Test fesetenv (FE_DFL_ENV) and fesetenv (FE_NOMASK_ENV) clear
2 exceptions (bug 19181).
3 Copyright (C) 2015-2022 Free Software Foundation, Inc.
4 This file is part of the GNU C Library.
5
6 The GNU C Library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
10
11 The GNU C Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public
17 License along with the GNU C Library; if not, see
18 <https://www.gnu.org/licenses/>. */
19
20 #include <fenv.h>
21 #include <float.h>
22 #include <stdio.h>
23
24 volatile float fa = 1.0f, fb = 0.0f, fc = FLT_MAX, fr;
25 volatile long double lda = 1.0L, ldb = 0.0L, ldc = LDBL_MAX, ldr;
26
27 static void
raise_exceptions(void)28 raise_exceptions (void)
29 {
30 /* Raise exceptions both with feraiseexcept and arithmetic to allow
31 for case of multiple floating-point units with separate
32 exceptions state. */
33 feraiseexcept (FE_ALL_EXCEPT);
34 fr = fb / fb;
35 fr = fa / fb;
36 fr = fc * fc;
37 fr = fa / fc / fc;
38 ldr = ldb / ldb;
39 ldr = lda / ldb;
40 ldr = ldc * ldc;
41 ldr = lda / ldc / ldc;
42 }
43
44 static __attribute__ ((noinline)) int
run_tests(void)45 run_tests (void)
46 {
47 int result = 0;
48 raise_exceptions ();
49 if (fesetenv (FE_DFL_ENV) == 0)
50 {
51 puts ("PASS: fesetenv (FE_DFL_ENV)");
52 if (fetestexcept (FE_ALL_EXCEPT) == 0)
53 puts ("PASS: fesetenv (FE_DFL_ENV) clearing exceptions");
54 else
55 {
56 puts ("FAIL: fesetenv (FE_DFL_ENV) clearing exceptions");
57 result = 1;
58 }
59 }
60 else
61 {
62 puts ("FAIL: fesetenv (FE_DFL_ENV)");
63 result = 1;
64 }
65 #ifdef FE_NOMASK_ENV
66 raise_exceptions ();
67 if (fesetenv (FE_NOMASK_ENV) == 0)
68 {
69 if (fetestexcept (FE_ALL_EXCEPT) == 0)
70 puts ("PASS: fesetenv (FE_NOMASK_ENV) clearing exceptions");
71 else
72 {
73 puts ("FAIL: fesetenv (FE_NOMASK_ENV) clearing exceptions");
74 result = 1;
75 }
76 }
77 else
78 puts ("fesetenv (FE_NOMASK_ENV) failed, cannot test");
79 #endif
80 return result;
81 }
82
83 static int
do_test(void)84 do_test (void)
85 {
86 CHECK_CAN_TEST;
87 return run_tests ();
88 }
89
90 #define TEST_FUNCTION do_test ()
91 #include "../test-skeleton.c"
92