On Haiku/x86_64, version hrev57363 or newer, I see this test failure:

FAIL test-fenv-except-state-2 (exit status: 149)

Looking at it in the debugger, it crashes at an 'fld1' instruction, here:

  /* 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;                  // <==== HERE

This means, the function fesetexceptflag() triggers a floating-point
exception, although it shouldn't.

This hypothesis can be verified by rebuilding with the configure arguments
  gl_cv_func_fesetexceptflag_works1=no gl_cv_func_fesetexceptflag_works2=no

So, this patch fixes it. Likewise on Haiku/i386 (r1beta4 from 2022).


2023-11-05  Bruno Haible  <br...@clisp.org>

        fenv-exceptions-trapping: Avoid test failure on Haiku/i386.
        * tests/test-fenv-except-trapping-2.c (main): Skip the '4' tests also on
        Haiku/i386.

        fenv-exceptions-state: Fix test failure on Haiku/i386 and Haiku/x86_64.
        * m4/fenv-exceptions-state.m4 (gl_FENV_EXCEPTIONS_STATE): Arrange to
        override fesetexceptflag() on Haiku.
        * doc/posix-functions/fesetexceptflag.texi: Mention the Haiku bug.



>From 057858a26b333132ec878f21d60ebfee47053d4d Mon Sep 17 00:00:00 2001
From: Bruno Haible <br...@clisp.org>
Date: Sun, 5 Nov 2023 22:16:38 +0100
Subject: [PATCH 1/2] fenv-exceptions-state: Fix test failure on Haiku/i386 and
 Haiku/x86_64.

* m4/fenv-exceptions-state.m4 (gl_FENV_EXCEPTIONS_STATE): Arrange to
override fesetexceptflag() on Haiku.
* doc/posix-functions/fesetexceptflag.texi: Mention the Haiku bug.
---
 ChangeLog                                | 7 +++++++
 doc/posix-functions/fesetexceptflag.texi | 2 +-
 m4/fenv-exceptions-state.m4              | 7 ++++++-
 3 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index dd3661fffd..0f5821ac4d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2023-11-05  Bruno Haible  <br...@clisp.org>
+
+	fenv-exceptions-state: Fix test failure on Haiku/i386 and Haiku/x86_64.
+	* m4/fenv-exceptions-state.m4 (gl_FENV_EXCEPTIONS_STATE): Arrange to
+	override fesetexceptflag() on Haiku.
+	* doc/posix-functions/fesetexceptflag.texi: Mention the Haiku bug.
+
 2023-11-05  Bruno Haible  <br...@clisp.org>
 
 	fenv: Add C++ tests.
diff --git a/doc/posix-functions/fesetexceptflag.texi b/doc/posix-functions/fesetexceptflag.texi
index 66075be675..3523dbb8f8 100644
--- a/doc/posix-functions/fesetexceptflag.texi
+++ b/doc/posix-functions/fesetexceptflag.texi
@@ -17,7 +17,7 @@
 glibc 2.37/i386, glibc 2.37/x86_64,
 @c https://sourceware.org/bugzilla/show_bug.cgi?id=30988
 glibc 2.37/powerpc,
-musl libc, Mac OS X 10.5, mingw.
+musl libc, Mac OS X 10.5, mingw, Haiku.
 @item
 This function clears too many floating-point exception flags on
 @c https://sourceware.org/bugzilla/show_bug.cgi?id=30998
diff --git a/m4/fenv-exceptions-state.m4 b/m4/fenv-exceptions-state.m4
index bd443be721..3cd09edd11 100644
--- a/m4/fenv-exceptions-state.m4
+++ b/m4/fenv-exceptions-state.m4
@@ -58,7 +58,8 @@ AC_DEFUN([gl_FENV_EXCEPTIONS_STATE]
       AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
       gl_MATHFUNC([feenableexcept], [int], [(int)], [#include <fenv.h>])
       dnl On glibc 2.37 for PowerPC, i386, x86_64, fesetexceptflag may raise
-      dnl traps. Likewise on Mac OS X 10.5.8 on i386, x86_64 and on mingw.
+      dnl traps. Likewise on Mac OS X 10.5.8 on i386, x86_64, on mingw, and
+      dnl on Haiku on i386, x86_64.
       AC_CACHE_CHECK([whether fesetexceptflag is guaranteed non-trapping],
         [gl_cv_func_fesetexceptflag_works1],
         [if test $gl_cv_func_feenableexcept_no_libm = yes \
@@ -129,6 +130,10 @@ AC_DEFUN([gl_FENV_EXCEPTIONS_STATE]
                  [gl_cv_func_fesetexceptflag_works1="guessing no"],
                  [gl_cv_func_fesetexceptflag_works1="guessing yes"])
                ;;
+             # Guess no on Haiku.
+             haiku*)
+               gl_cv_func_fesetexceptflag_works1="guessing no"
+               ;;
              *) gl_cv_func_fesetexceptflag_works1="guessing yes" ;;
            esac
          fi
-- 
2.34.1

>From e28c0b311c5cc90ef4d441e88ae2e94adc9e3e2e Mon Sep 17 00:00:00 2001
From: Bruno Haible <br...@clisp.org>
Date: Sun, 5 Nov 2023 22:22:35 +0100
Subject: [PATCH 2/2] fenv-exceptions-trapping: Avoid test failure on
 Haiku/i386.

* tests/test-fenv-except-trapping-2.c (main): Skip the '4' tests also on
Haiku/i386.
---
 ChangeLog                           | 4 ++++
 tests/test-fenv-except-trapping-2.c | 6 ++++--
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 0f5821ac4d..0648ef3720 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2023-11-05  Bruno Haible  <br...@clisp.org>
 
+	fenv-exceptions-trapping: Avoid test failure on Haiku/i386.
+	* tests/test-fenv-except-trapping-2.c (main): Skip the '4' tests also on
+	Haiku/i386.
+
 	fenv-exceptions-state: Fix test failure on Haiku/i386 and Haiku/x86_64.
 	* m4/fenv-exceptions-state.m4 (gl_FENV_EXCEPTIONS_STATE): Arrange to
 	override fesetexceptflag() on Haiku.
diff --git a/tests/test-fenv-except-trapping-2.c b/tests/test-fenv-except-trapping-2.c
index c1d5509355..41da5d5b28 100644
--- a/tests/test-fenv-except-trapping-2.c
+++ b/tests/test-fenv-except-trapping-2.c
@@ -439,7 +439,8 @@ main (int argc, char *argv[])
            AIX/powerpc,
            Solaris/i386, Solaris/x86_64,
            Cygwin/x86_64,
-           native Windows/i386, native Windows/x86_64.
+           native Windows/i386, native Windows/x86_64,
+           Haiku/i386.
          Explanation of some of the {i386,x86_64} cases:
          - Quoting the Intel 64 and IA-32 Architectures Software Developer's
            Manual:
@@ -461,7 +462,8 @@ main (int argc, char *argv[])
           || (defined _AIX && defined __powerpc__) \
           || (defined __sun && ((defined __x86_64__ || defined _M_X64) || (defined __i386 || defined _M_IX86))) \
           || (defined __CYGWIN__ && (defined __x86_64__ || defined _M_X64)) \
-          || (defined _WIN32 && ((defined __x86_64__ || defined _M_X64) || (defined __i386 || defined _M_IX86)))
+          || (defined _WIN32 && ((defined __x86_64__ || defined _M_X64) || (defined __i386 || defined _M_IX86))) \
+          || (defined __HAIKU__ && (defined __i386 || defined _M_IX86))
       known_failure |= (operation_arg[0] == '4');
       #endif
       /* The '7' and '8' tests, with types 'f' and 'd', do not work reliably
-- 
2.34.1

Reply via email to