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