/* Test of tracking of floating-point exceptions. Copyright (C) 2023-2024 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* Written by Bruno Haible , 2023. */ #include /* Specification. */ #include #include #include "fpe-trapping.h" #include "macros.h" /* musl libc does not support floating-point exception trapping, even where the hardware supports it. See */ #if HAVE_FPE_TRAPPING && (!MUSL_LIBC || GNULIB_FEENABLEEXCEPT) /* Check that fesetexcept() does not trigger a trap. */ static volatile double a, b; static volatile long double al, bl; int main () { /* Clear FE_INVALID exceptions from past operations. */ feclearexcept (FE_INVALID); /* An FE_INVALID exception shall trigger a SIGFPE signal, which by default terminates the program. */ if (sigfpe_on_invalid () < 0) { fputs ("Skipping test: trapping floating-point exceptions are not supported on this machine.\n", stderr); return 77; } /* Attempt to set the FE_INVALID exception flag. */ _GL_UNUSED int rc = fesetexcept (FE_INVALID); /* On older i386 and on PowerPC, there is no way to implement fesetexcept() such that it does not trigger a trap. fesetexcept() is expected to fail in this case. */ # if !((defined __i386 || defined _M_IX86) || defined __powerpc__) ASSERT (rc == 0); # endif /* Do a harmless floating-point operation (since on some CPUs, floating-point exceptions trigger a trap only at the next floating-point operation). */ a = 1.0; b = a + a; al = 1.0L; bl = al + al; return 0; } #else int main () { fputs ("Skipping test: feenableexcept not available\n", stderr); return 77; } #endif