/* Test nearbyint functions do not clear exceptions (bug 15491). Copyright (C) 2015-2016 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 . */ #include #include #include #include #ifndef FE_INVALID # define FE_INVALID 0 #endif #define TEST_FUNC(NAME, FLOAT, SUFFIX) \ static int \ NAME (void) \ { \ int result = 0; \ volatile FLOAT a, b __attribute__ ((unused)); \ a = 1.0; \ /* nearbyint must not clear already-raised exceptions. */ \ feraiseexcept (FE_ALL_EXCEPT); \ b = nearbyint ## SUFFIX (a); \ if (fetestexcept (FE_ALL_EXCEPT) == FE_ALL_EXCEPT) \ puts ("PASS: " #FLOAT); \ else \ { \ puts ("FAIL: " #FLOAT); \ result = 1; \ } \ /* But it mustn't lose exceptions from sNaN arguments. */ \ if (SNAN_TESTS (FLOAT) && EXCEPTION_TESTS (FLOAT)) \ { \ static volatile FLOAT snan = __builtin_nans ## SUFFIX (""); \ volatile FLOAT c __attribute__ ((unused)); \ feclearexcept (FE_ALL_EXCEPT); \ c = nearbyint ## SUFFIX (snan); \ if (fetestexcept (FE_INVALID) == FE_INVALID) \ puts ("PASS: " #FLOAT " sNaN"); \ else \ { \ puts ("FAIL: " #FLOAT " sNaN"); \ result = 1; \ } \ } \ return result; \ } TEST_FUNC (float_test, float, f) TEST_FUNC (double_test, double, ) #ifndef NO_LONG_DOUBLE TEST_FUNC (ldouble_test, long double, l) #endif static int do_test (void) { int result = float_test (); result |= double_test (); #ifndef NO_LONG_DOUBLE result |= ldouble_test (); #endif return result; } #define TEST_FUNCTION do_test () #include "../test-skeleton.c"