diff options
Diffstat (limited to 'REORG.TODO/math/test-fexcept.c')
-rw-r--r-- | REORG.TODO/math/test-fexcept.c | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/REORG.TODO/math/test-fexcept.c b/REORG.TODO/math/test-fexcept.c new file mode 100644 index 0000000000..854080173a --- /dev/null +++ b/REORG.TODO/math/test-fexcept.c @@ -0,0 +1,206 @@ +/* Test fegetexceptflag and fesetexceptflag. + Copyright (C) 2016-2017 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 <stdio.h> +#include <math-tests.h> + +/* Like feraiseexcept, but raise exactly the specified exceptions EXC, + without possibly raising "inexact" together with "overflow" or + "underflow" as permitted by ISO C. (This is not used with traps + enabled, so side-effects from raising and then clearing "inexact" + are irrelevant.) */ + +static int +feraiseexcept_exact (int exc) +{ +#ifdef FE_INEXACT + int mask = 0; +#ifdef FE_OVERFLOW + mask |= FE_OVERFLOW; +#endif +#ifdef FE_UNDERFLOW + mask |= FE_UNDERFLOW; +#endif + if ((exc & FE_INEXACT) != 0 + || (exc & mask) == 0 + || fetestexcept (FE_INEXACT) != 0) + return feraiseexcept (exc); + int ret = feraiseexcept (exc); + feclearexcept (FE_INEXACT); + return ret; +#else + return feraiseexcept (exc); +#endif +} + +static int +test_set (int initial, const fexcept_t *saved, int mask, int expected) +{ + int result = 0; + feclearexcept (FE_ALL_EXCEPT); + printf ("Testing set: initial exceptions %x, mask %x, expected %x\n", + (unsigned int) initial, (unsigned int) mask, + (unsigned int) expected); + int ret = feraiseexcept_exact (initial); + if (ret != 0) + { + puts ("feraiseexcept failed"); + if (initial == 0 || EXCEPTION_TESTS (float)) + { + puts ("failure of feraiseexcept was unexpected"); + result = 1; + } + else + puts ("failure of feraiseexcept OK, skipping further tests"); + return result; + } + ret = fesetexceptflag (saved, mask); + if (ret != 0) + { + puts ("fesetexceptflag failed"); + result = 1; + } + else + puts ("fesetexceptflag succeeded"); + ret = fetestexcept (FE_ALL_EXCEPT); + if (ret != expected) + { + printf ("raised exceptions %x, expected %x\n", + (unsigned int) ret, (unsigned int) expected); + result = 1; + } + return result; +} + +static int +test_except (int exc, const char *exc_name) +{ + int result = 0; + + printf ("Testing %s\n", exc_name); + feclearexcept (FE_ALL_EXCEPT); + + fexcept_t clear_saved_exc, clear_saved_all; + int ret = fegetexceptflag (&clear_saved_exc, exc); + if (ret == 0) + printf ("fegetexceptflag (%s) succeeded\n", exc_name); + else + { + printf ("fegetexceptflag (%s) failed\n", exc_name); + result = 1; + return result; + } + ret = fegetexceptflag (&clear_saved_all, FE_ALL_EXCEPT); + if (ret == 0) + puts ("fegetexceptflag (FE_ALL_EXCEPT) succeeded"); + else + { + puts ("fegetexceptflag (FE_ALL_EXCEPT) failed"); + result = 1; + return result; + } + + ret = feraiseexcept_exact (exc); + if (ret == 0) + printf ("feraiseexcept (%s) succeeded\n", exc_name); + else + { + printf ("feraiseexcept (%s) failed\n", exc_name); + if (exc == 0 || EXCEPTION_TESTS (float)) + { + puts ("failure of feraiseexcept was unexpected"); + result = 1; + } + else + puts ("failure of feraiseexcept OK, skipping further tests"); + return result; + } + + fexcept_t set_saved_exc, set_saved_all; + ret = fegetexceptflag (&set_saved_exc, exc); + if (ret == 0) + printf ("fegetexceptflag (%s) succeeded\n", exc_name); + else + { + printf ("fegetexceptflag (%s) failed\n", exc_name); + result = 1; + return result; + } + ret = fegetexceptflag (&set_saved_all, FE_ALL_EXCEPT); + if (ret == 0) + puts ("fegetexceptflag (FE_ALL_EXCEPT) succeeded"); + else + { + puts ("fegetexceptflag (FE_ALL_EXCEPT) failed"); + result = 1; + return result; + } + + result |= test_set (0, &set_saved_exc, exc, exc); + result |= test_set (0, &set_saved_all, exc, exc); + result |= test_set (0, &set_saved_all, FE_ALL_EXCEPT, exc); + result |= test_set (0, &clear_saved_exc, exc, 0); + result |= test_set (0, &clear_saved_all, exc, 0); + result |= test_set (0, &clear_saved_all, FE_ALL_EXCEPT, 0); + result |= test_set (exc, &set_saved_exc, exc, exc); + result |= test_set (exc, &set_saved_all, exc, exc); + result |= test_set (exc, &set_saved_all, FE_ALL_EXCEPT, exc); + result |= test_set (exc, &clear_saved_exc, exc, 0); + result |= test_set (exc, &clear_saved_all, exc, 0); + result |= test_set (exc, &clear_saved_all, FE_ALL_EXCEPT, 0); + result |= test_set (FE_ALL_EXCEPT, &set_saved_exc, exc, FE_ALL_EXCEPT); + result |= test_set (FE_ALL_EXCEPT, &set_saved_all, exc, FE_ALL_EXCEPT); + result |= test_set (FE_ALL_EXCEPT, &set_saved_all, FE_ALL_EXCEPT, exc); + result |= test_set (FE_ALL_EXCEPT, &clear_saved_exc, exc, + FE_ALL_EXCEPT & ~exc); + result |= test_set (FE_ALL_EXCEPT, &clear_saved_all, exc, + FE_ALL_EXCEPT & ~exc); + result |= test_set (FE_ALL_EXCEPT, &clear_saved_all, FE_ALL_EXCEPT, 0); + + return result; +} + +static int +do_test (void) +{ + int result = 0; + + result |= test_except (0, "0"); + result |= test_except (FE_ALL_EXCEPT, "FE_ALL_EXCEPT"); +#ifdef FE_DIVBYZERO + result |= test_except (FE_DIVBYZERO, "FE_DIVBYZERO"); +#endif +#ifdef FE_INEXACT + result |= test_except (FE_INEXACT, "FE_INEXACT"); +#endif +#ifdef FE_INVALID + result |= test_except (FE_INVALID, "FE_INVALID"); +#endif +#ifdef FE_OVERFLOW + result |= test_except (FE_OVERFLOW, "FE_OVERFLOW"); +#endif +#ifdef FE_UNDERFLOW + result |= test_except (FE_UNDERFLOW, "FE_UNDERFLOW"); +#endif + + return result; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" |