]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix math/test-fenv for no-exceptions / no-rounding-modes configurations.
authorJoseph Myers <joseph@codesourcery.com>
Mon, 9 Jan 2017 18:27:49 +0000 (18:27 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Mon, 9 Jan 2017 18:27:49 +0000 (18:27 +0000)
This patch fixes math/test-fenv.c to check EXCEPTION_TESTS and
ROUNDING_TESTS to avoid failing in cases where some exceptions or
rounding modes are defined but not supported at runtime.

Tested for mips64 soft float and for x86_64.

* math/test-fenv.c (fe_tests): Skip most tests when exceptions not
supported.
(feholdexcept_tests): Skip tests requiring exceptions or rounding
modes support if not supported.

ChangeLog
math/test-fenv.c

index 14542933544a29e0b5e4d511dca935871dab62be..034cce97a298d344d42f6f3b9915cefd4a187071 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2017-01-09  Joseph Myers  <joseph@codesourcery.com>
 
+       * math/test-fenv.c (fe_tests): Skip most tests when exceptions not
+       supported.
+       (feholdexcept_tests): Skip tests requiring exceptions or rounding
+       modes support if not supported.
+
        * sysdeps/unix/sysv/linux/microblaze/localplt.data (__pread64):
        Add libc.so PLT entry.
        (__tls_get_addr): Make ld.so PLT entry optional.
index d698ec3584e912884bc4b1016634238998fb48fb..b24b3a1e31ad0769c54d10e2eb0f230eaa7662d6 100644 (file)
@@ -208,6 +208,9 @@ fe_tests (void)
   test_exceptions ("feclearexcept (FE_ALL_EXCEPT) clears all exceptions",
                    NO_EXC, 0);
 
+  /* Skip further tests here if exceptions not supported.  */
+  if (!EXCEPTION_TESTS (float) && FE_ALL_EXCEPT != 0)
+    return;
   /* raise all exceptions and test if all are raised */
   feraiseexcept (FE_ALL_EXCEPT);
   test_exceptions ("feraiseexcept (FE_ALL_EXCEPT) raises all exceptions",
@@ -657,8 +660,9 @@ feholdexcept_tests (void)
 #ifdef FE_DIVBYZERO
   feraiseexcept (FE_DIVBYZERO);
 #endif
-  test_exceptions ("feholdexcept_tests FE_DIVBYZERO test",
-                  DIVBYZERO_EXC, 0);
+  if (EXCEPTION_TESTS (float))
+    test_exceptions ("feholdexcept_tests FE_DIVBYZERO test",
+                    DIVBYZERO_EXC, 0);
   res = feholdexcept (&saved);
   if (res != 0)
     {
@@ -667,7 +671,7 @@ feholdexcept_tests (void)
     }
 #if defined FE_TONEAREST && defined FE_TOWARDZERO
   res = fesetround (FE_TOWARDZERO);
-  if (res != 0)
+  if (res != 0 && ROUNDING_TESTS (float, FE_TOWARDZERO))
     {
       printf ("fesetround failed: %d\n", res);
       ++count_errors;
@@ -676,8 +680,9 @@ feholdexcept_tests (void)
   test_exceptions ("feholdexcept_tests 0 test", NO_EXC, 0);
 #ifdef FE_INVALID
   feraiseexcept (FE_INVALID);
-  test_exceptions ("feholdexcept_tests FE_INVALID test",
-                  INVALID_EXC, 0);
+  if (EXCEPTION_TESTS (float))
+    test_exceptions ("feholdexcept_tests FE_INVALID test",
+                    INVALID_EXC, 0);
 #endif
   res = feupdateenv (&saved);
   if (res != 0)
@@ -693,15 +698,16 @@ feholdexcept_tests (void)
       ++count_errors;
     }
 #endif
-  test_exceptions ("feholdexcept_tests FE_DIVBYZERO|FE_INVALID test",
-                  DIVBYZERO_EXC | INVALID_EXC, 0);
+  if (EXCEPTION_TESTS (float))
+    test_exceptions ("feholdexcept_tests FE_DIVBYZERO|FE_INVALID test",
+                    DIVBYZERO_EXC | INVALID_EXC, 0);
   feclearexcept (FE_ALL_EXCEPT);
 #ifdef FE_INVALID
   feraiseexcept (FE_INVALID);
 #endif
 #if defined FE_TONEAREST && defined FE_UPWARD
   res = fesetround (FE_UPWARD);
-  if (res != 0)
+  if (res != 0 && ROUNDING_TESTS (float, FE_UPWARD))
     {
       printf ("fesetround failed: %d\n", res);
       ++count_errors;
@@ -724,8 +730,9 @@ feholdexcept_tests (void)
   test_exceptions ("feholdexcept_tests 0 2nd test", NO_EXC, 0);
 #ifdef FE_INEXACT
   feraiseexcept (FE_INEXACT);
-  test_exceptions ("feholdexcept_tests FE_INEXACT test",
-                  INEXACT_EXC, 0);
+  if (EXCEPTION_TESTS (float))
+    test_exceptions ("feholdexcept_tests FE_INEXACT test",
+                    INEXACT_EXC, 0);
 #endif
   res = feupdateenv (&saved2);
   if (res != 0)
@@ -735,15 +742,16 @@ feholdexcept_tests (void)
     }
 #if defined FE_TONEAREST && defined FE_UPWARD
   res = fegetround ();
-  if (res != FE_UPWARD)
+  if (res != FE_UPWARD && ROUNDING_TESTS (float, FE_UPWARD))
     {
       printf ("feupdateenv didn't restore rounding mode: %d\n", res);
       ++count_errors;
     }
   fesetround (FE_TONEAREST);
 #endif
-  test_exceptions ("feholdexcept_tests FE_INEXACT|FE_INVALID test",
-                  INVALID_EXC | INEXACT_EXC, 0);
+  if (EXCEPTION_TESTS (float))
+    test_exceptions ("feholdexcept_tests FE_INEXACT|FE_INVALID test",
+                    INVALID_EXC | INEXACT_EXC, 0);
   feclearexcept (FE_ALL_EXCEPT);
 }