]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Make libm-test-support code clear exceptions after each test.
authorJoseph Myers <joseph@codesourcery.com>
Fri, 23 Jun 2017 20:10:45 +0000 (20:10 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Fri, 23 Jun 2017 20:10:45 +0000 (20:10 +0000)
The libm-test-support code clears exceptions at the end of
test_exceptions.  However, it's possible that exceptions get raised as
part of the subsequent checks on the results of the function being
tested, and such exceptions then carry through to the next test run
and can cause that to fail spuriously.  In particular, it's possible
for the ulps calculation to raise exceptions in some cases.  This
patch puts exception clearing at the end of each of the check_*
functions, alongside errno clearing, to avoid one test affecting the
next in that way.

Tested for x86_64 (in conjunction with float128 patches).

* libm-test-support.c (check_float_internal): Clear exceptions at
end of function.
(check_int): Likewise.
(check_long): Likewise.
(check_bool): Likewise.
(check_longlong): Likewise.
(check_intmax_t): Likewise.
(check_uintmax_t): Likewise.

ChangeLog
math/libm-test-support.c

index fa0ac20c194e4d06b37a07a9f9287842c90434ed..464e65d101ae5f13878a5550ba3b7d4e867d813a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
 2017-06-23  Joseph Myers  <joseph@codesourcery.com>
 
+       * libm-test-support.c (check_float_internal): Clear exceptions at
+       end of function.
+       (check_int): Likewise.
+       (check_long): Likewise.
+       (check_bool): Likewise.
+       (check_longlong): Likewise.
+       (check_intmax_t): Likewise.
+       (check_uintmax_t): Likewise.
+
        * sysdeps/x86/fpu/bits/fenv.h [_LIBC] (__feraiseexcept_renamed):
        Do not declare.
        * sysdeps/x86/fpu/include/bits/fenv.h [_LIBC &&
index 7612d394d629cf67819121c5fa9fb41796518462..078d30743dafc922ed757cd5133ac45ac08c16c6 100644 (file)
@@ -718,6 +718,7 @@ check_float_internal (const char *test_name, FLOAT computed, FLOAT expected,
 
  out:
   fpstack_test (test_name);
+  feclearexcept (FE_ALL_EXCEPT);
   errno = 0;
 }
 
@@ -795,6 +796,7 @@ check_int (const char *test_name, int computed, int expected,
   update_stats (ok);
  out:
   fpstack_test (test_name);
+  feclearexcept (FE_ALL_EXCEPT);
   errno = 0;
 }
 
@@ -828,6 +830,7 @@ check_long (const char *test_name, long int computed, long int expected,
   update_stats (ok);
  out:
   fpstack_test (test_name);
+  feclearexcept (FE_ALL_EXCEPT);
   errno = 0;
 }
 
@@ -861,6 +864,7 @@ check_bool (const char *test_name, int computed, int expected,
   update_stats (ok);
  out:
   fpstack_test (test_name);
+  feclearexcept (FE_ALL_EXCEPT);
   errno = 0;
 }
 
@@ -895,6 +899,7 @@ check_longlong (const char *test_name, long long int computed,
   update_stats (ok);
  out:
   fpstack_test (test_name);
+  feclearexcept (FE_ALL_EXCEPT);
   errno = 0;
 }
 
@@ -928,6 +933,7 @@ check_intmax_t (const char *test_name, intmax_t computed,
   update_stats (ok);
  out:
   fpstack_test (test_name);
+  feclearexcept (FE_ALL_EXCEPT);
   errno = 0;
 }
 
@@ -961,6 +967,7 @@ check_uintmax_t (const char *test_name, uintmax_t computed,
   update_stats (ok);
  out:
   fpstack_test (test_name);
+  feclearexcept (FE_ALL_EXCEPT);
   errno = 0;
 }