From 43799ecbe6dc5c5b8b254f0b86b08b810dae3573 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Fri, 13 Oct 2023 00:59:27 +0200 Subject: [PATCH] snan: Add tests. * tests/test-snan-1.c: New file. * tests/test-snan-2.sh: New file. * tests/test-snan-2.c: New file. * modules/snan-tests: New file. --- ChangeLog | 8 ++++ modules/snan-tests | 17 ++++++++ tests/test-snan-1.c | 82 +++++++++++++++++++++++++++++++++++++ tests/test-snan-2.c | 96 ++++++++++++++++++++++++++++++++++++++++++++ tests/test-snan-2.sh | 40 ++++++++++++++++++ 5 files changed, 243 insertions(+) create mode 100644 modules/snan-tests create mode 100644 tests/test-snan-1.c create mode 100644 tests/test-snan-2.c create mode 100755 tests/test-snan-2.sh diff --git a/ChangeLog b/ChangeLog index 117ea7d70e..2a2ed122e1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2023-10-12 Bruno Haible + + snan: Add tests. + * tests/test-snan-1.c: New file. + * tests/test-snan-2.sh: New file. + * tests/test-snan-2.c: New file. + * modules/snan-tests: New file. + 2023-10-12 Bruno Haible nan: Add tests. diff --git a/modules/snan-tests b/modules/snan-tests new file mode 100644 index 0000000000..d3f2b8615e --- /dev/null +++ b/modules/snan-tests @@ -0,0 +1,17 @@ +Files: +tests/test-snan-1.c +tests/test-snan-2.sh +tests/test-snan-2.c +tests/macros.h + +Depends-on: +fpe-tracking +fpe-trapping + +configure.ac: + +Makefile.am: +TESTS += test-snan-1 test-snan-2.sh +check_PROGRAMS += test-snan-1 test-snan-2 +test_snan_1_LDADD = $(LDADD) @FPE_TRACKING_LIBM@ +test_snan_2_LDADD = $(LDADD) @FPE_TRAPPING_LIBM@ diff --git a/tests/test-snan-1.c b/tests/test-snan-1.c new file mode 100644 index 0000000000..de87372f17 --- /dev/null +++ b/tests/test-snan-1.c @@ -0,0 +1,82 @@ +/* Tests of signalling 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 "snan.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 = SNaNf (); + double volatile nand = SNaNd (); + long double volatile nanl = SNaNl (); + + /* Check that the values are really signalling. */ + { + 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-snan-2.c b/tests/test-snan-2.c new file mode 100644 index 0000000000..e1ee7c8928 --- /dev/null +++ b/tests/test-snan-2.c @@ -0,0 +1,96 @@ +/* Tests of signalling 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 "snan.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 (int argc, char *argv[]) +{ + /* 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 = SNaNf (); + double volatile nand = SNaNd (); + long double volatile nanl = SNaNl (); + + /* Check that the values are really signalling. */ + + /* 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; + } + + if (argc > 1) + switch (argv[1][0]) + { + case 'f': + resultf = nanf + 42.0f; + break; + case 'd': + resultd = nand + 42.0; + break; + case 'l': + resultl = nanl + 42.0L; + break; + default: + break; + } + + 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 diff --git a/tests/test-snan-2.sh b/tests/test-snan-2.sh new file mode 100755 index 0000000000..596e3ea483 --- /dev/null +++ b/tests/test-snan-2.sh @@ -0,0 +1,40 @@ +#!/bin/sh + +# Test of signalling not-a-number. + +final_rc=0 + +${CHECKER} ./test-snan-2${EXEEXT} f +rc=$? +if test $rc = 77; then + final_rc=77 +else + if test $rc = 0; then + echo "Use of SNaNf() did not signal." 1>&2 + exit 1 + fi +fi + +${CHECKER} ./test-snan-2${EXEEXT} d +rc=$? +if test $rc = 77; then + final_rc=77 +else + if test $rc = 0; then + echo "Use of SNaNd() did not signal." 1>&2 + exit 1 + fi +fi + +${CHECKER} ./test-snan-2${EXEEXT} l +rc=$? +if test $rc = 77; then + final_rc=77 +else + if test $rc = 0; then + echo "Use of SNaNl() did not signal." 1>&2 + exit 1 + fi +fi + +exit $final_rc -- 2.39.5