/* Test fegetexceptflag and fesetexceptflag. Copyright (C) 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 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 (initial); if (ret != 0) { puts ("feraiseexcept failed"); result = 1; 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 (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"