]> Savannah Git Hosting - gnulib.git/commitdiff
snan: Add tests.
authorBruno Haible <bruno@clisp.org>
Thu, 12 Oct 2023 22:59:27 +0000 (00:59 +0200)
committerBruno Haible <bruno@clisp.org>
Thu, 12 Oct 2023 22:59:27 +0000 (00:59 +0200)
* 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
modules/snan-tests [new file with mode: 0644]
tests/test-snan-1.c [new file with mode: 0644]
tests/test-snan-2.c [new file with mode: 0644]
tests/test-snan-2.sh [new file with mode: 0755]

index 117ea7d70edb1f5b9ae239e22ce37b6b1beef242..2a2ed122e1cd24b2336fc20ef04c24a2c9983963 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2023-10-12  Bruno Haible  <bruno@clisp.org>
+
+       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  <bruno@clisp.org>
 
        nan: Add tests.
diff --git a/modules/snan-tests b/modules/snan-tests
new file mode 100644 (file)
index 0000000..d3f2b86
--- /dev/null
@@ -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 (file)
index 0000000..de87372
--- /dev/null
@@ -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 <https://www.gnu.org/licenses/>.  */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2023.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include "snan.h"
+
+#if HAVE_FE_INVALID
+
+# include <fenv.h>
+
+# 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 <fenv.h> available.
+   We could use the various alternative approaches from
+   libgfortran/config/fpu-*.h, but that's not worth it.  */
+
+#include <stdio.h>
+
+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 (file)
index 0000000..e1ee7c8
--- /dev/null
@@ -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 <https://www.gnu.org/licenses/>.  */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2023.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include "snan.h"
+
+#include <stdio.h>
+
+#include "fpe-trapping.h"
+
+#if HAVE_FPE_TRAPPING
+
+# include <fenv.h>
+
+# 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 (executable)
index 0000000..596e3ea
--- /dev/null
@@ -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