]> Savannah Git Hosting - gnulib.git/commitdiff
fenv-*: Avoid test failures on FreeBSD/powerpc64 and NetBSD/powerpc.
authorBruno Haible <bruno@clisp.org>
Fri, 19 Jan 2024 21:04:33 +0000 (22:04 +0100)
committerBruno Haible <bruno@clisp.org>
Wed, 31 Jan 2024 16:46:12 +0000 (17:46 +0100)
On these platforms, FE_ALL_EXCEPT contains additional bits.

* tests/test-fenv-except-tracking-1.c (FE_VXSOFT, FE_VXZDZ): Define
fallbacks.
(main): Allow fetestexcept(FE_ALL_EXCEPT) to contain FE_VXSOFT or
FE_VXZDZ in addition to FE_INVALID.
* tests/test-fenv-except-tracking-4.c (FE_VXSOFT): Define fallback.
(main): Allow fetestexcept(FE_ALL_EXCEPT) to contain FE_VXSOFT in
addition to FE_INVALID.
* tests/test-fenv-env-2.c: Likewise.
* tests/test-fenv-env-3.c: Likewise.
* tests/test-fenv-env-4.c: Likewise.
* tests/test-fenv-env-5.c: Likewise.

ChangeLog
tests/test-fenv-env-2.c
tests/test-fenv-env-3.c
tests/test-fenv-env-4.c
tests/test-fenv-env-5.c
tests/test-fenv-except-tracking-1.c
tests/test-fenv-except-tracking-4.c

index 90648837a11f2f9e68ec0b2fc3f81be9f048d3e4..f372fd14c688f5d76f90ad2ac47f781d3616a9fb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2024-01-19  Bruno Haible  <bruno@clisp.org>
+
+       fenv-*: Avoid test failures on FreeBSD/powerpc64 and NetBSD/powerpc.
+       On these platforms, FE_ALL_EXCEPT contains additional bits.
+       * tests/test-fenv-except-tracking-1.c (FE_VXSOFT, FE_VXZDZ): Define
+       fallbacks.
+       (main): Allow fetestexcept(FE_ALL_EXCEPT) to contain FE_VXSOFT or
+       FE_VXZDZ in addition to FE_INVALID.
+       * tests/test-fenv-except-tracking-4.c (FE_VXSOFT): Define fallback.
+       (main): Allow fetestexcept(FE_ALL_EXCEPT) to contain FE_VXSOFT in
+       addition to FE_INVALID.
+       * tests/test-fenv-env-2.c: Likewise.
+       * tests/test-fenv-env-3.c: Likewise.
+       * tests/test-fenv-env-4.c: Likewise.
+       * tests/test-fenv-env-5.c: Likewise.
+
 2024-01-19  Bruno Haible  <bruno@clisp.org>
 
        fenv-*: Fix test failures on NetBSD 9.3/arm64.
index 9ea5b096bb41d513210b250bb26671d497b969c3..f1cc482608ad619fd146602596c2e99b6da94a4e 100644 (file)
 
 /* Test the combination of fegetenv() with fesetenv().  */
 
+/* On *BSD/powerpc systems, raising FE_INVALID also sets FE_VXSOFT.  */
+#ifndef FE_VXSOFT
+# define FE_VXSOFT 0
+#endif
+
 int
 main ()
 {
@@ -49,7 +54,10 @@ main ()
   ASSERT (fegetenv (&env2) == 0);
 
   /* Check that the exception flags are unmodified.  */
-  ASSERT (fetestexcept (FE_ALL_EXCEPT) == (supports_tracking ? FE_INVALID | FE_OVERFLOW | FE_INEXACT : 0));
+  if (supports_tracking)
+    ASSERT ((fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT) == (FE_INVALID | FE_OVERFLOW | FE_INEXACT));
+  else
+    ASSERT (fetestexcept (FE_ALL_EXCEPT) == 0);
   /* Check that the exception trap bits are unmodified.  */
   ASSERT (fegetexcept () == (supports_trapping ? FE_DIVBYZERO : 0));
 
@@ -79,7 +87,10 @@ main ()
   /* Check that the rounding direction has been restored.  */
   ASSERT (fegetround () == FE_UPWARD);
   /* Check that the exception flags have been restored.  */
-  ASSERT (fetestexcept (FE_ALL_EXCEPT) == (supports_tracking ? FE_INVALID | FE_OVERFLOW | FE_INEXACT : 0));
+  if (supports_tracking)
+    ASSERT ((fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT) == (FE_INVALID | FE_OVERFLOW | FE_INEXACT));
+  else
+    ASSERT (fetestexcept (FE_ALL_EXCEPT) == 0);
   /* Check that the exception trap bits have been restored.  */
   ASSERT (fegetexcept () == (supports_trapping ? FE_DIVBYZERO : 0));
 
index 61e7b4a03e3a962e6ff62f3f14a923b6f07501cd..7dbe93b465fad153e4b15287f05120d491131f2e 100644 (file)
 
 /* Test the combination of fegetenv() with feupdateenv().  */
 
+/* On *BSD/powerpc systems, raising FE_INVALID also sets FE_VXSOFT.  */
+#ifndef FE_VXSOFT
+# define FE_VXSOFT 0
+#endif
+
 int
 main ()
 {
@@ -49,7 +54,10 @@ main ()
   ASSERT (fegetenv (&env2) == 0);
 
   /* Check that the exception flags are unmodified.  */
-  ASSERT (fetestexcept (FE_ALL_EXCEPT) == (supports_tracking ? FE_INVALID | FE_OVERFLOW | FE_INEXACT : 0));
+  if (supports_tracking)
+    ASSERT ((fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT) == (FE_INVALID | FE_OVERFLOW | FE_INEXACT));
+  else
+    ASSERT (fetestexcept (FE_ALL_EXCEPT) == 0);
   /* Check that the exception trap bits are unmodified.  */
   ASSERT (fegetexcept () == (supports_trapping ? FE_DIVBYZERO : 0));
 
@@ -61,7 +69,10 @@ main ()
   /* Check that the exception flags are the union of the saved and of the
      current exception flags.  (The saved exception flags happen to be none
      in this case.)  */
-  ASSERT (fetestexcept (FE_ALL_EXCEPT) == (supports_tracking ? FE_INVALID | FE_OVERFLOW | FE_INEXACT : 0));
+  if (supports_tracking)
+    ASSERT ((fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT) == (FE_INVALID | FE_OVERFLOW | FE_INEXACT));
+  else
+    ASSERT (fetestexcept (FE_ALL_EXCEPT) == 0);
   /* Check that the exception trap bits have been restored.  */
   ASSERT (fegetexcept () == 0);
 
@@ -82,7 +93,10 @@ main ()
   ASSERT (fegetround () == FE_UPWARD);
   /* Check that the exception flags are the union of the saved and of the
      current exception flags.  */
-  ASSERT (fetestexcept (FE_ALL_EXCEPT) == (supports_tracking ? FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT : 0));
+  if (supports_tracking)
+    ASSERT ((fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT) == (FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT));
+  else
+    ASSERT (fetestexcept (FE_ALL_EXCEPT) == 0);
   /* Check that the exception trap bits have been restored.  */
   ASSERT (fegetexcept () == (supports_trapping ? FE_DIVBYZERO : 0));
 
@@ -95,7 +109,10 @@ main ()
   /* Check that the rounding direction has been restored,
      whereas the exception flags are unmodified.  */
   ASSERT (fegetround () == FE_TONEAREST);
-  ASSERT (fetestexcept (FE_ALL_EXCEPT) == (supports_tracking ? FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT : 0));
+  if (supports_tracking)
+    ASSERT ((fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT) == (FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT));
+  else
+    ASSERT (fetestexcept (FE_ALL_EXCEPT) == 0);
 
   /* Enable trapping on FE_INVALID.  */
   feclearexcept (FE_INVALID);
index 13bd5adb9553dcb7a4d8b296ce35f30f013af204..af75fc02157e2a4e4c794c9b2a5774a58044cf87 100644 (file)
 
 /* Test the combination of feholdexcept() with fesetenv().  */
 
+/* On *BSD/powerpc systems, raising FE_INVALID also sets FE_VXSOFT.  */
+#ifndef FE_VXSOFT
+# define FE_VXSOFT 0
+#endif
+
 int
 main ()
 {
@@ -79,7 +84,10 @@ main ()
   /* Check that the rounding direction has been restored.  */
   ASSERT (fegetround () == FE_UPWARD);
   /* Check that the exception flags have been restored.  */
-  ASSERT (fetestexcept (FE_ALL_EXCEPT) == (supports_tracking ? FE_INVALID | FE_OVERFLOW | FE_INEXACT : 0));
+  if (supports_tracking)
+    ASSERT ((fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT) == (FE_INVALID | FE_OVERFLOW | FE_INEXACT));
+  else
+    ASSERT (fetestexcept (FE_ALL_EXCEPT) == 0);
   /* Check that the exception trap bits have been restored.  */
   ASSERT (fegetexcept () == (supports_trapping ? FE_DIVBYZERO : 0));
 
index 82f7c0e1f9602dc93e0a6b20133bb315c0b6c190..4c6980e25408f0dffd7069a8ccd1eed890664d91 100644 (file)
 
 /* Test the combination of feholdexcept() with feupdateenv().  */
 
+/* On *BSD/powerpc systems, raising FE_INVALID also sets FE_VXSOFT.  */
+#ifndef FE_VXSOFT
+# define FE_VXSOFT 0
+#endif
+
 int
 main ()
 {
@@ -82,7 +87,10 @@ main ()
   ASSERT (fegetround () == FE_UPWARD);
   /* Check that the exception flags are the union of the saved and of the
      current exception flags.  */
-  ASSERT (fetestexcept (FE_ALL_EXCEPT) == (supports_tracking ? FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT : 0));
+  if (supports_tracking)
+    ASSERT ((fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT) == (FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT));
+  else
+    ASSERT (fetestexcept (FE_ALL_EXCEPT) == 0);
   /* Check that the exception trap bits have been restored.  */
   ASSERT (fegetexcept () == (supports_trapping ? FE_DIVBYZERO : 0));
 
@@ -95,7 +103,10 @@ main ()
   /* Check that the rounding direction has been restored,
      whereas the exception flags are unmodified.  */
   ASSERT (fegetround () == FE_TONEAREST);
-  ASSERT (fetestexcept (FE_ALL_EXCEPT) == (supports_tracking ? FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT : 0));
+  if (supports_tracking)
+    ASSERT ((fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT) == (FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT));
+  else
+    ASSERT (fetestexcept (FE_ALL_EXCEPT) == 0);
 
   /* Enable trapping on FE_INVALID.  */
   feclearexcept (FE_INVALID);
index f795e2b2788fce2f6dd2dfd7ffa1affba0ce8a75..70bdda563a0b9dfa5c27c9d0e18bb277f3cd462a 100644 (file)
 
 #include "macros.h"
 
+/* On *BSD/powerpc systems, raising FE_INVALID also sets FE_VXSOFT.  */
+#ifndef FE_VXSOFT
+# define FE_VXSOFT 0
+#endif
+#ifndef FE_VXZDZ
+# define FE_VXZDZ 0
+#endif
+
 static volatile double a, b, c;
 
 int
@@ -37,7 +45,7 @@ main ()
   ASSERT (/* with the libc's feraiseexcept(): */
           fetestexcept (FE_ALL_EXCEPT) == FE_ALL_EXCEPT
           || /* with gnulib's feraiseexcept(): */
-             fetestexcept (FE_ALL_EXCEPT)
+             (fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT)
              == (FE_DIVBYZERO | FE_INEXACT | FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW));
   ASSERT (fetestexcept (FE_INVALID) == FE_INVALID);
   ASSERT (fetestexcept (FE_DIVBYZERO) == FE_DIVBYZERO);
@@ -58,7 +66,7 @@ main ()
   /* Test setting just one exception flag: FE_INVALID.  */
   ASSERT (feclearexcept (FE_ALL_EXCEPT) == 0);
   ASSERT (feraiseexcept (FE_INVALID) == 0);
-  ASSERT (fetestexcept (FE_ALL_EXCEPT) == FE_INVALID);
+  ASSERT ((fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT) == FE_INVALID);
   ASSERT (fetestexcept (FE_INVALID) == FE_INVALID);
   ASSERT (fetestexcept (FE_DIVBYZERO) == 0);
   ASSERT (fetestexcept (FE_OVERFLOW) == 0);
@@ -128,7 +136,7 @@ main ()
   ASSERT (/* with the libc's feraiseexcept(): */
           fetestexcept (FE_ALL_EXCEPT) == (FE_ALL_EXCEPT & ~FE_DIVBYZERO)
           || /* with gnulib's feraiseexcept(): */
-             fetestexcept (FE_ALL_EXCEPT)
+             (fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT)
              == (FE_INEXACT | FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW));
   ASSERT (fetestexcept (FE_INVALID) == FE_INVALID);
   ASSERT (fetestexcept (FE_DIVBYZERO) == 0);
@@ -142,7 +150,7 @@ main ()
   ASSERT (/* with the libc's feraiseexcept(): */
           fetestexcept (FE_ALL_EXCEPT) == (FE_ALL_EXCEPT & ~FE_OVERFLOW)
           || /* with gnulib's feraiseexcept(): */
-             fetestexcept (FE_ALL_EXCEPT)
+             (fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT)
              == (FE_DIVBYZERO | FE_INEXACT | FE_INVALID | FE_UNDERFLOW));
   ASSERT (fetestexcept (FE_INVALID) == FE_INVALID);
   ASSERT (fetestexcept (FE_DIVBYZERO) == FE_DIVBYZERO);
@@ -156,7 +164,7 @@ main ()
   ASSERT (/* with the libc's feraiseexcept(): */
           fetestexcept (FE_ALL_EXCEPT) == (FE_ALL_EXCEPT & ~FE_UNDERFLOW)
           || /* with gnulib's feraiseexcept(): */
-             fetestexcept (FE_ALL_EXCEPT)
+             (fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT)
              == (FE_DIVBYZERO | FE_INEXACT | FE_INVALID | FE_OVERFLOW));
   ASSERT (fetestexcept (FE_INVALID) == FE_INVALID);
   ASSERT (fetestexcept (FE_DIVBYZERO) == FE_DIVBYZERO);
@@ -170,7 +178,7 @@ main ()
   ASSERT (/* with the libc's feraiseexcept(): */
           fetestexcept (FE_ALL_EXCEPT) == (FE_ALL_EXCEPT & ~FE_INEXACT)
           || /* with gnulib's feraiseexcept(): */
-             fetestexcept (FE_ALL_EXCEPT)
+             (fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT)
              == (FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW));
   ASSERT (fetestexcept (FE_INVALID) == FE_INVALID);
   ASSERT (fetestexcept (FE_DIVBYZERO) == FE_DIVBYZERO);
@@ -183,7 +191,7 @@ main ()
   /* Test the effects of an operation that produces FE_INVALID.  */
   ASSERT (feclearexcept (FE_ALL_EXCEPT) == 0);
   a = 0; b = 0; c = a / b;
-  ASSERT (fetestexcept (FE_ALL_EXCEPT) == FE_INVALID);
+  ASSERT ((fetestexcept (FE_ALL_EXCEPT) & ~FE_VXZDZ) == FE_INVALID);
   ASSERT (fetestexcept (FE_INVALID) == FE_INVALID);
   ASSERT (fetestexcept (FE_DIVBYZERO) == 0);
   ASSERT (fetestexcept (FE_OVERFLOW) == 0);
index 9f8859dac92fd51d25cdfb65673913163dcf3072..060d036b0786484c9d870e47eddd06ac02c2bdf7 100644 (file)
 
 /* Check that fesetexcept() works.  */
 
+/* On *BSD/powerpc systems, raising FE_INVALID also sets FE_VXSOFT.  */
+#ifndef FE_VXSOFT
+# define FE_VXSOFT 0
+#endif
+
 int
 main ()
 {
@@ -42,7 +47,7 @@ main ()
   /* Test setting just one exception flag: FE_INVALID.  */
   ASSERT (feclearexcept (FE_ALL_EXCEPT) == 0);
   ASSERT (fesetexcept (FE_INVALID) == 0);
-  ASSERT (fetestexcept (FE_ALL_EXCEPT) == FE_INVALID);
+  ASSERT ((fetestexcept (FE_ALL_EXCEPT) & ~FE_VXSOFT) == FE_INVALID);
   ASSERT (fetestexcept (FE_INVALID) == FE_INVALID);
   ASSERT (fetestexcept (FE_DIVBYZERO) == 0);
   ASSERT (fetestexcept (FE_OVERFLOW) == 0);