1  /* Test fesetenv (FE_DFL_ENV) and fesetenv (FE_NOMASK_ENV) clear
       2     exceptions (bug 19181).
       3     Copyright (C) 2015-2023 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
      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
      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
      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"