about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2017-01-09 18:27:49 +0000
committerJoseph Myers <joseph@codesourcery.com>2017-01-09 18:27:49 +0000
commitc6be839efded78768ad3c70d7f2e913a9fb8603c (patch)
treeb4f2c3f5989142b0cc87c72213db607efe261333
parentc35db50ff51480c39e5ce493561df1c4581da9fc (diff)
downloadglibc-c6be839efded78768ad3c70d7f2e913a9fb8603c.tar.gz
glibc-c6be839efded78768ad3c70d7f2e913a9fb8603c.tar.xz
glibc-c6be839efded78768ad3c70d7f2e913a9fb8603c.zip
Fix math/test-fenv for no-exceptions / no-rounding-modes configurations.
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.
-rw-r--r--ChangeLog5
-rw-r--r--math/test-fenv.c34
2 files changed, 26 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog
index 1454293354..034cce97a2 100644
--- 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.
diff --git a/math/test-fenv.c b/math/test-fenv.c
index d698ec3584..b24b3a1e31 100644
--- a/math/test-fenv.c
+++ b/math/test-fenv.c
@@ -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);
 }