(root)/
glibc-2.38/
math/
test-fexcept-traps.c
       1  /* Test fegetexceptflag and fesetexceptflag: exception traps enabled.
       2     Copyright (C) 2016-2023 Free Software Foundation, Inc.
       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
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #include <fenv.h>
      20  #include <stdio.h>
      21  #include <math-tests.h>
      22  
      23  static int
      24  do_test (void)
      25  {
      26    int result = 0;
      27  
      28    fedisableexcept (FE_ALL_EXCEPT);
      29    int ret = feraiseexcept (FE_ALL_EXCEPT);
      30    if (ret != 0)
      31      {
      32        if (EXCEPTION_TESTS (float))
      33  	{
      34  	  puts ("feraiseexcept (FE_ALL_EXCEPT) failed");
      35  	  result = 1;
      36  	  return result;
      37  	}
      38        else
      39  	{
      40  	  puts ("feraiseexcept (FE_ALL_EXCEPT) unsupported, cannot test");
      41  	  return 77;
      42  	}
      43      }
      44    fexcept_t saved;
      45    ret = fegetexceptflag (&saved, FE_ALL_EXCEPT);
      46    if (ret != 0)
      47      {
      48        puts ("fegetexceptflag failed");
      49        result = 1;
      50        return result;
      51      }
      52    feclearexcept (FE_ALL_EXCEPT);
      53  
      54    ret = feenableexcept (FE_ALL_EXCEPT);
      55    if (!EXCEPTION_ENABLE_SUPPORTED (FE_ALL_EXCEPT) && (ret == -1))
      56      {
      57        puts ("feenableexcept (FE_ALL_EXCEPT) not supported, cannot test");
      58        return 77;
      59      }
      60    else if (ret != 0)
      61      {
      62        puts ("feenableexcept (FE_ALL_EXCEPT) failed");
      63        result = 1;
      64      }
      65  
      66    if (EXCEPTION_SET_FORCES_TRAP)
      67      {
      68        puts ("setting exceptions traps, cannot test on this architecture");
      69        return 77;
      70      }
      71    /* The test is that this does not cause exception traps.  */
      72    ret = fesetexceptflag (&saved, FE_ALL_EXCEPT);
      73    if (ret != 0)
      74      {
      75        puts ("fesetexceptflag failed");
      76        result = 1;
      77      }
      78    feclearexcept (FE_ALL_EXCEPT);
      79  
      80    return result;
      81  }
      82  
      83  #define TEST_FUNCTION do_test ()
      84  #include "../test-skeleton.c"