From 3c26f061e287a01a7001a03999765887ae4d5dcf Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Fri, 13 Oct 2023 00:52:03 +0200 Subject: [PATCH] nan: Add tests. * tests/test-nan-1.c: New file. * tests/test-nan-2.c: New file. * modules/nan-tests: New file. --- ChangeLog | 7 ++++ modules/nan-tests | 16 +++++++++ tests/test-nan-1.c | 82 ++++++++++++++++++++++++++++++++++++++++++++ tests/test-nan-2.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 189 insertions(+) create mode 100644 modules/nan-tests create mode 100644 tests/test-nan-1.c create mode 100644 tests/test-nan-2.c diff --git a/ChangeLog b/ChangeLog index a3d58dc308..117ea7d70e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2023-10-12 Bruno Haible + + nan: Add tests. + * tests/test-nan-1.c: New file. + * tests/test-nan-2.c: New file. + * modules/nan-tests: New file. + 2023-10-12 Bruno Haible fpe-tracking, fpe-trapping: New modules. diff --git a/modules/nan-tests b/modules/nan-tests new file mode 100644 index 0000000000..607e35f63b --- /dev/null +++ b/modules/nan-tests @@ -0,0 +1,16 @@ +Files: +tests/test-nan-1.c +tests/test-nan-2.c +tests/macros.h + +Depends-on: +fpe-tracking +fpe-trapping + +configure.ac: + +Makefile.am: +TESTS += test-nan-1 test-nan-2 +check_PROGRAMS += test-nan-1 test-nan-2 +test_nan_1_LDADD = $(LDADD) @FPE_TRACKING_LIBM@ +test_nan_2_LDADD = $(LDADD) @FPE_TRAPPING_LIBM@ diff --git a/tests/test-nan-1.c b/tests/test-nan-1.c new file mode 100644 index 0000000000..9bce3225c1 --- /dev/null +++ b/tests/test-nan-1.c @@ -0,0 +1,82 @@ +/* Tests of quiet not-a-number. + Copyright (C) 2023 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 "nan.h" + +#if HAVE_FE_INVALID + +# include + +# include "macros.h" + +float volatile resultf; +double volatile resultd; +long double volatile resultl; + +int +main () +{ + /* Fetch the NaN values before we start watching out for FE_INVALID + exceptions, because the division 0.0 / 0.0 itself also raises an + FE_INVALID exception. + The use of 'volatile' prevents the compiler from doing constant-folding + optimizations on these values. An alternative, for GCC only, would be + the command-line option '-fsignaling-nans'. */ + float volatile nanf = NaNf (); + double volatile nand = NaNd (); + long double volatile nanl = NaNl (); + + /* Check that the values are really quiet. */ + { + feclearexcept (FE_INVALID); + resultf = nanf + 42.0f; + ASSERT (!fetestexcept (FE_INVALID)); + } + { + feclearexcept (FE_INVALID); + resultd = nand + 42.0; + ASSERT (!fetestexcept (FE_INVALID)); + } + { + feclearexcept (FE_INVALID); + resultl = nanl + 42.0L; + ASSERT (!fetestexcept (FE_INVALID)); + } + + return 0; +} + +#else + +/* No available. + We could use the various alternative approaches from + libgfortran/config/fpu-*.h, but that's not worth it. */ + +#include + +int +main () +{ + fputs ("Skipping test: feclearexcept, fetestexcept, FE_INVALID not available\n", stderr); + return 77; +} + +#endif diff --git a/tests/test-nan-2.c b/tests/test-nan-2.c new file mode 100644 index 0000000000..b82ebabf4b --- /dev/null +++ b/tests/test-nan-2.c @@ -0,0 +1,84 @@ +/* Tests of quiet not-a-number. + Copyright (C) 2023 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 "nan.h" + +#include + +#include "fpe-trapping.h" + +#if HAVE_FPE_TRAPPING + +# include + +# include "macros.h" + +float volatile resultf; +double volatile resultd; +long double volatile resultl; + +int +main () +{ + /* Fetch the NaN values before we start watching out for FE_INVALID + exceptions, because the division 0.0 / 0.0 itself also raises an + FE_INVALID exception. + The use of 'volatile' prevents the compiler from doing constant-folding + optimizations on these values. An alternative, for GCC only, would be + the command-line option '-fsignaling-nans'. */ + float volatile nanf = NaNf (); + double volatile nand = NaNd (); + long double volatile nanl = NaNl (); + + /* Check that the values are really quiet. */ + + /* 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; + } + + resultf = nanf + 42.0f; + resultd = nand + 42.0; + resultl = nanl + 42.0L; + + return 0; +} + +#else + +/* No HAVE_FPE_TRAPPING available. + We could use the various alternative approaches from + libgfortran/config/fpu-*.h, but that's not worth it. */ + +int +main () +{ + fputs ("Skipping test: feenableexcept or fpsetmask or fp_enable not available\n", stderr); + return 77; +} + +#endif -- 2.39.5