/* Test fesetenv (FE_DFL_ENV) and fesetenv (FE_NOMASK_ENV) clear
   exceptions (bug 19181).
   Copyright (C) 2015-2018 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

#include <fenv.h>
#include <float.h>
#include <stdio.h>

volatile float fa = 1.0f, fb = 0.0f, fc = FLT_MAX, fr;
volatile long double lda = 1.0L, ldb = 0.0L, ldc = LDBL_MAX, ldr;

static void
raise_exceptions (void)
{
  /* Raise exceptions both with feraiseexcept and arithmetic to allow
     for case of multiple floating-point units with separate
     exceptions state.  */
  feraiseexcept (FE_ALL_EXCEPT);
  fr = fb / fb;
  fr = fa / fb;
  fr = fc * fc;
  fr = fa / fc / fc;
  ldr = ldb / ldb;
  ldr = lda / ldb;
  ldr = ldc * ldc;
  ldr = lda / ldc / ldc;
}

static __attribute__ ((noinline)) int
run_tests (void)
{
  int result = 0;
  raise_exceptions ();
  if (fesetenv (FE_DFL_ENV) == 0)
    {
      puts ("PASS: fesetenv (FE_DFL_ENV)");
      if (fetestexcept (FE_ALL_EXCEPT) == 0)
	puts ("PASS: fesetenv (FE_DFL_ENV) clearing exceptions");
      else
	{
	  puts ("FAIL: fesetenv (FE_DFL_ENV) clearing exceptions");
	  result = 1;
	}
    }
  else
    {
      puts ("FAIL: fesetenv (FE_DFL_ENV)");
      result = 1;
    }
#ifdef FE_NOMASK_ENV
  raise_exceptions ();
  if (fesetenv (FE_NOMASK_ENV) == 0)
    {
      if (fetestexcept (FE_ALL_EXCEPT) == 0)
	puts ("PASS: fesetenv (FE_NOMASK_ENV) clearing exceptions");
      else
	{
	  puts ("FAIL: fesetenv (FE_NOMASK_ENV) clearing exceptions");
	  result = 1;
	}
    }
  else
    puts ("fesetenv (FE_NOMASK_ENV) failed, cannot test");
#endif
  return result;
}

static int
do_test (void)
{
  CHECK_CAN_TEST;
  return run_tests ();
}

#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"
