Blame math/test-fexcept.c

Packit 6c4009
/* Test fegetexceptflag and fesetexceptflag.
Packit 6c4009
   Copyright (C) 2016-2018 Free Software Foundation, Inc.
Packit 6c4009
   This file is part of the GNU C Library.
Packit 6c4009
Packit 6c4009
   The GNU C Library is free software; you can redistribute it and/or
Packit 6c4009
   modify it under the terms of the GNU Lesser General Public
Packit 6c4009
   License as published by the Free Software Foundation; either
Packit 6c4009
   version 2.1 of the License, or (at your option) any later version.
Packit 6c4009
Packit 6c4009
   The GNU C Library is distributed in the hope that it will be useful,
Packit 6c4009
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6c4009
   Lesser General Public License for more details.
Packit 6c4009
Packit 6c4009
   You should have received a copy of the GNU Lesser General Public
Packit 6c4009
   License along with the GNU C Library; if not, see
Packit 6c4009
   <http://www.gnu.org/licenses/>.  */
Packit 6c4009
Packit 6c4009
#include <fenv.h>
Packit 6c4009
#include <stdio.h>
Packit 6c4009
#include <math-tests.h>
Packit 6c4009
Packit 6c4009
/* Like feraiseexcept, but raise exactly the specified exceptions EXC,
Packit 6c4009
   without possibly raising "inexact" together with "overflow" or
Packit 6c4009
   "underflow" as permitted by ISO C.  (This is not used with traps
Packit 6c4009
   enabled, so side-effects from raising and then clearing "inexact"
Packit 6c4009
   are irrelevant.)  */
Packit 6c4009
Packit 6c4009
static int
Packit 6c4009
feraiseexcept_exact (int exc)
Packit 6c4009
{
Packit 6c4009
#ifdef FE_INEXACT
Packit 6c4009
  int mask = 0;
Packit 6c4009
#ifdef FE_OVERFLOW
Packit 6c4009
  mask |= FE_OVERFLOW;
Packit 6c4009
#endif
Packit 6c4009
#ifdef FE_UNDERFLOW
Packit 6c4009
  mask |= FE_UNDERFLOW;
Packit 6c4009
#endif
Packit 6c4009
  if ((exc & FE_INEXACT) != 0
Packit 6c4009
      || (exc & mask) == 0
Packit 6c4009
      || fetestexcept (FE_INEXACT) != 0)
Packit 6c4009
    return feraiseexcept (exc);
Packit 6c4009
  int ret = feraiseexcept (exc);
Packit 6c4009
  feclearexcept (FE_INEXACT);
Packit 6c4009
  return ret;
Packit 6c4009
#else
Packit 6c4009
  return feraiseexcept (exc);
Packit 6c4009
#endif
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static int
Packit 6c4009
test_set (int initial, const fexcept_t *saved, int mask, int expected)
Packit 6c4009
{
Packit 6c4009
  int result = 0;
Packit 6c4009
  feclearexcept (FE_ALL_EXCEPT);
Packit 6c4009
  printf ("Testing set: initial exceptions %x, mask %x, expected %x\n",
Packit 6c4009
	  (unsigned int) initial, (unsigned int) mask,
Packit 6c4009
	  (unsigned int) expected);
Packit 6c4009
  int ret = feraiseexcept_exact (initial);
Packit 6c4009
  if (ret != 0)
Packit 6c4009
    {
Packit 6c4009
      puts ("feraiseexcept failed");
Packit 6c4009
      if (initial == 0 || EXCEPTION_TESTS (float))
Packit 6c4009
	{
Packit 6c4009
	  puts ("failure of feraiseexcept was unexpected");
Packit 6c4009
	  result = 1;
Packit 6c4009
	}
Packit 6c4009
      else
Packit 6c4009
	puts ("failure of feraiseexcept OK, skipping further tests");
Packit 6c4009
      return result;
Packit 6c4009
    }
Packit 6c4009
  ret = fesetexceptflag (saved, mask);
Packit 6c4009
  if (ret != 0)
Packit 6c4009
    {
Packit 6c4009
      puts ("fesetexceptflag failed");
Packit 6c4009
      result = 1;
Packit 6c4009
    }
Packit 6c4009
  else
Packit 6c4009
    puts ("fesetexceptflag succeeded");
Packit 6c4009
  ret = fetestexcept (FE_ALL_EXCEPT);
Packit 6c4009
  if (ret != expected)
Packit 6c4009
    {
Packit 6c4009
      printf ("raised exceptions %x, expected %x\n",
Packit 6c4009
	      (unsigned int) ret, (unsigned int) expected);
Packit 6c4009
      result = 1;
Packit 6c4009
    }
Packit 6c4009
  return result;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static int
Packit 6c4009
test_except (int exc, const char *exc_name)
Packit 6c4009
{
Packit 6c4009
  int result = 0;
Packit 6c4009
Packit 6c4009
  printf ("Testing %s\n", exc_name);
Packit 6c4009
  feclearexcept (FE_ALL_EXCEPT);
Packit 6c4009
Packit 6c4009
  fexcept_t clear_saved_exc, clear_saved_all;
Packit 6c4009
  int ret = fegetexceptflag (&clear_saved_exc, exc);
Packit 6c4009
  if (ret == 0)
Packit 6c4009
    printf ("fegetexceptflag (%s) succeeded\n", exc_name);
Packit 6c4009
  else
Packit 6c4009
    {
Packit 6c4009
      printf ("fegetexceptflag (%s) failed\n", exc_name);
Packit 6c4009
      result = 1;
Packit 6c4009
      return result;
Packit 6c4009
    }
Packit 6c4009
  ret = fegetexceptflag (&clear_saved_all, FE_ALL_EXCEPT);
Packit 6c4009
  if (ret == 0)
Packit 6c4009
    puts ("fegetexceptflag (FE_ALL_EXCEPT) succeeded");
Packit 6c4009
  else
Packit 6c4009
    {
Packit 6c4009
      puts ("fegetexceptflag (FE_ALL_EXCEPT) failed");
Packit 6c4009
      result = 1;
Packit 6c4009
      return result;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  ret = feraiseexcept_exact (exc);
Packit 6c4009
  if (ret == 0)
Packit 6c4009
    printf ("feraiseexcept (%s) succeeded\n", exc_name);
Packit 6c4009
  else
Packit 6c4009
    {
Packit 6c4009
      printf ("feraiseexcept (%s) failed\n", exc_name);
Packit 6c4009
      if (exc == 0 || EXCEPTION_TESTS (float))
Packit 6c4009
	{
Packit 6c4009
	  puts ("failure of feraiseexcept was unexpected");
Packit 6c4009
	  result = 1;
Packit 6c4009
	}
Packit 6c4009
      else
Packit 6c4009
	puts ("failure of feraiseexcept OK, skipping further tests");
Packit 6c4009
      return result;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  fexcept_t set_saved_exc, set_saved_all;
Packit 6c4009
  ret = fegetexceptflag (&set_saved_exc, exc);
Packit 6c4009
  if (ret == 0)
Packit 6c4009
    printf ("fegetexceptflag (%s) succeeded\n", exc_name);
Packit 6c4009
  else
Packit 6c4009
    {
Packit 6c4009
      printf ("fegetexceptflag (%s) failed\n", exc_name);
Packit 6c4009
      result = 1;
Packit 6c4009
      return result;
Packit 6c4009
    }
Packit 6c4009
  ret = fegetexceptflag (&set_saved_all, FE_ALL_EXCEPT);
Packit 6c4009
  if (ret == 0)
Packit 6c4009
    puts ("fegetexceptflag (FE_ALL_EXCEPT) succeeded");
Packit 6c4009
  else
Packit 6c4009
    {
Packit 6c4009
      puts ("fegetexceptflag (FE_ALL_EXCEPT) failed");
Packit 6c4009
      result = 1;
Packit 6c4009
      return result;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  result |= test_set (0, &set_saved_exc, exc, exc);
Packit 6c4009
  result |= test_set (0, &set_saved_all, exc, exc);
Packit 6c4009
  result |= test_set (0, &set_saved_all, FE_ALL_EXCEPT, exc);
Packit 6c4009
  result |= test_set (0, &clear_saved_exc, exc, 0);
Packit 6c4009
  result |= test_set (0, &clear_saved_all, exc, 0);
Packit 6c4009
  result |= test_set (0, &clear_saved_all, FE_ALL_EXCEPT, 0);
Packit 6c4009
  result |= test_set (exc, &set_saved_exc, exc, exc);
Packit 6c4009
  result |= test_set (exc, &set_saved_all, exc, exc);
Packit 6c4009
  result |= test_set (exc, &set_saved_all, FE_ALL_EXCEPT, exc);
Packit 6c4009
  result |= test_set (exc, &clear_saved_exc, exc, 0);
Packit 6c4009
  result |= test_set (exc, &clear_saved_all, exc, 0);
Packit 6c4009
  result |= test_set (exc, &clear_saved_all, FE_ALL_EXCEPT, 0);
Packit 6c4009
  result |= test_set (FE_ALL_EXCEPT, &set_saved_exc, exc, FE_ALL_EXCEPT);
Packit 6c4009
  result |= test_set (FE_ALL_EXCEPT, &set_saved_all, exc, FE_ALL_EXCEPT);
Packit 6c4009
  result |= test_set (FE_ALL_EXCEPT, &set_saved_all, FE_ALL_EXCEPT, exc);
Packit 6c4009
  result |= test_set (FE_ALL_EXCEPT, &clear_saved_exc, exc,
Packit 6c4009
		      FE_ALL_EXCEPT & ~exc);
Packit 6c4009
  result |= test_set (FE_ALL_EXCEPT, &clear_saved_all, exc,
Packit 6c4009
		      FE_ALL_EXCEPT & ~exc);
Packit 6c4009
  result |= test_set (FE_ALL_EXCEPT, &clear_saved_all, FE_ALL_EXCEPT, 0);
Packit 6c4009
Packit 6c4009
  return result;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static int
Packit 6c4009
do_test (void)
Packit 6c4009
{
Packit 6c4009
  int result = 0;
Packit 6c4009
Packit 6c4009
  result |= test_except (0, "0");
Packit 6c4009
  result |= test_except (FE_ALL_EXCEPT, "FE_ALL_EXCEPT");
Packit 6c4009
#ifdef FE_DIVBYZERO
Packit 6c4009
  result |= test_except (FE_DIVBYZERO, "FE_DIVBYZERO");
Packit 6c4009
#endif
Packit 6c4009
#ifdef FE_INEXACT
Packit 6c4009
  result |= test_except (FE_INEXACT, "FE_INEXACT");
Packit 6c4009
#endif
Packit 6c4009
#ifdef FE_INVALID
Packit 6c4009
  result |= test_except (FE_INVALID, "FE_INVALID");
Packit 6c4009
#endif
Packit 6c4009
#ifdef FE_OVERFLOW
Packit 6c4009
  result |= test_except (FE_OVERFLOW, "FE_OVERFLOW");
Packit 6c4009
#endif
Packit 6c4009
#ifdef FE_UNDERFLOW
Packit 6c4009
  result |= test_except (FE_UNDERFLOW, "FE_UNDERFLOW");
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
  return result;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
#define TEST_FUNCTION do_test ()
Packit 6c4009
#include "../test-skeleton.c"