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
24volatile float fa = 1.0f, fb = 0.0f, fc = FLT_MAX, fr;
25volatile long double lda = 1.0L, ldb = 0.0L, ldc = LDBL_MAX, ldr;
26
27static void
28raise_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
44static __attribute__ ((noinline)) int
45run_tests (void)
46{
47 int result = 0;
48 raise_exceptions ();
49 if (fesetenv (FE_DFL_ENV) == 0)
50 {
51 puts (s: "PASS: fesetenv (FE_DFL_ENV)");
52 if (fetestexcept (FE_ALL_EXCEPT) == 0)
53 puts (s: "PASS: fesetenv (FE_DFL_ENV) clearing exceptions");
54 else
55 {
56 puts (s: "FAIL: fesetenv (FE_DFL_ENV) clearing exceptions");
57 result = 1;
58 }
59 }
60 else
61 {
62 puts (s: "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 (s: "PASS: fesetenv (FE_NOMASK_ENV) clearing exceptions");
71 else
72 {
73 puts (s: "FAIL: fesetenv (FE_NOMASK_ENV) clearing exceptions");
74 result = 1;
75 }
76 }
77 else
78 puts (s: "fesetenv (FE_NOMASK_ENV) failed, cannot test");
79#endif
80 return result;
81}
82
83static int
84do_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

source code of glibc/math/test-fenv-clear-main.c