diff options
author | Joseph Myers <joseph@codesourcery.com> | 2015-02-11 23:17:25 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2015-02-11 23:17:25 +0000 |
commit | d435569cd626bccb9c27361202a279d0fd7fce88 (patch) | |
tree | d307669a2d90be6d52f58a9409f8f5f21575bbe1 | |
parent | ef0ffcfd13fea7544c2d83d222963b0da4963734 (diff) | |
download | glibc-d435569cd626bccb9c27361202a279d0fd7fce88.tar.gz glibc-d435569cd626bccb9c27361202a279d0fd7fce88.tar.xz glibc-d435569cd626bccb9c27361202a279d0fd7fce88.zip |
Fix sincos errno setting (bug 15467).
This patch makes sincos set errno to EDOM when passed an infinity, similarly to sin and cos. Tested for x86_64, x86, powerpc and mips64. I don't know if the architecture-specific implementations for ia64 and m68k might need corresponding fixes. 2015-02-11 Joseph Myers <joseph@codesourcery.com> [BZ #15467] * sysdeps/ieee754/dbl-64/s_sincos.c: Include <errno.h>. (__sincos): Set errno to EDOM for infinite argument. * sysdeps/ieee754/flt-32/s_sincosf.c: Include <errno.h>. (SINCOSF_FUNC): Set errno to EDOM for infinite argument. * sysdeps/ieee754/ldbl-128/s_sincosl.c: Include <errno.h>. (__sincosl): Set errno to EDOM for infinite argument. * sysdeps/ieee754/ldbl-128ibm/s_sincosl.c: Include <errno.h>. (__sincosl): Set errno to EDOM for infinite argument. * sysdeps/ieee754/ldbl-96/s_sincosl.c: Include <errno.h>. (__sincosl): Set errno to EDOM for infinite argument. * math/libm-test.inc (sincos_test_data): Test errno setting.
-rw-r--r-- | ChangeLog | 15 | ||||
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | math/libm-test.inc | 6 | ||||
-rw-r--r-- | sysdeps/ieee754/dbl-64/s_sincos.c | 3 | ||||
-rw-r--r-- | sysdeps/ieee754/flt-32/s_sincosf.c | 3 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128/s_sincosl.c | 3 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128ibm/s_sincosl.c | 3 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-96/s_sincosl.c | 3 |
8 files changed, 34 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog index fd890c5690..c61a392255 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2015-02-11 Joseph Myers <joseph@codesourcery.com> + + [BZ #15467] + * sysdeps/ieee754/dbl-64/s_sincos.c: Include <errno.h>. + (__sincos): Set errno to EDOM for infinite argument. + * sysdeps/ieee754/flt-32/s_sincosf.c: Include <errno.h>. + (SINCOSF_FUNC): Set errno to EDOM for infinite argument. + * sysdeps/ieee754/ldbl-128/s_sincosl.c: Include <errno.h>. + (__sincosl): Set errno to EDOM for infinite argument. + * sysdeps/ieee754/ldbl-128ibm/s_sincosl.c: Include <errno.h>. + (__sincosl): Set errno to EDOM for infinite argument. + * sysdeps/ieee754/ldbl-96/s_sincosl.c: Include <errno.h>. + (__sincosl): Set errno to EDOM for infinite argument. + * math/libm-test.inc (sincos_test_data): Test errno setting. + 2015-02-11 Leonhard Holz <leonhard.holz@web.de> * string/strxfrm_l.c: Remove #define STRCMP. diff --git a/NEWS b/NEWS index d85e26fdd2..2d4ebb951b 100644 --- a/NEWS +++ b/NEWS @@ -9,7 +9,7 @@ Version 2.22 * The following bugs are resolved with this release: - 4719, 17912, 17932, 17944, 17949. + 4719, 15467, 17912, 17932, 17944, 17949. Version 2.21 diff --git a/math/libm-test.inc b/math/libm-test.inc index 6d7ff12e04..aa7ba2b765 100644 --- a/math/libm-test.inc +++ b/math/libm-test.inc @@ -9335,9 +9335,9 @@ sin_test (void) static const struct test_fFF_11_data sincos_test_data[] = { - TEST_fFF_11 (sincos, plus_infty, qnan_value, qnan_value, INVALID_EXCEPTION), - TEST_fFF_11 (sincos, minus_infty, qnan_value, qnan_value, INVALID_EXCEPTION), - TEST_fFF_11 (sincos, qnan_value, qnan_value, qnan_value, NO_INEXACT_EXCEPTION), + TEST_fFF_11 (sincos, plus_infty, qnan_value, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM), + TEST_fFF_11 (sincos, minus_infty, qnan_value, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM), + TEST_fFF_11 (sincos, qnan_value, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), AUTO_TESTS_fFF_11 (sincos), }; diff --git a/sysdeps/ieee754/dbl-64/s_sincos.c b/sysdeps/ieee754/dbl-64/s_sincos.c index 7d3b10139f..c8a99991cc 100644 --- a/sysdeps/ieee754/dbl-64/s_sincos.c +++ b/sysdeps/ieee754/dbl-64/s_sincos.c @@ -17,6 +17,7 @@ License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ +#include <errno.h> #include <math.h> #include <math_private.h> @@ -36,6 +37,8 @@ __sincos (double x, double *sinx, double *cosx) { /* sin(Inf or NaN) is NaN */ *sinx = *cosx = x - x; + if (__isinf_ns (x)) + __set_errno (EDOM); } else { diff --git a/sysdeps/ieee754/flt-32/s_sincosf.c b/sysdeps/ieee754/flt-32/s_sincosf.c index 5cf5db03cb..596e076609 100644 --- a/sysdeps/ieee754/flt-32/s_sincosf.c +++ b/sysdeps/ieee754/flt-32/s_sincosf.c @@ -17,6 +17,7 @@ License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ +#include <errno.h> #include <math.h> #include <math_private.h> @@ -46,6 +47,8 @@ SINCOSF_FUNC (float x, float *sinx, float *cosx) { /* sin(Inf or NaN) is NaN */ *sinx = *cosx = x - x; + if (ix == 0x7f800000) + __set_errno (EDOM); } else { diff --git a/sysdeps/ieee754/ldbl-128/s_sincosl.c b/sysdeps/ieee754/ldbl-128/s_sincosl.c index 175a617d1a..6c4cbd7237 100644 --- a/sysdeps/ieee754/ldbl-128/s_sincosl.c +++ b/sysdeps/ieee754/ldbl-128/s_sincosl.c @@ -18,6 +18,7 @@ License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ +#include <errno.h> #include <math.h> #include <math_private.h> @@ -38,6 +39,8 @@ __sincosl (long double x, long double *sinx, long double *cosx) { /* sin(Inf or NaN) is NaN */ *sinx = *cosx = x - x; + if (__isinf_nsl (x)) + __set_errno (EDOM); } else { diff --git a/sysdeps/ieee754/ldbl-128ibm/s_sincosl.c b/sysdeps/ieee754/ldbl-128ibm/s_sincosl.c index f52e73385d..8a49c54d6c 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_sincosl.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_sincosl.c @@ -18,6 +18,7 @@ License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ +#include <errno.h> #include <math.h> #include <math_private.h> @@ -41,6 +42,8 @@ __sincosl (long double x, long double *sinx, long double *cosx) { /* sin(Inf or NaN) is NaN */ *sinx = *cosx = x - x; + if (__isinf_nsl (x)) + __set_errno (EDOM); } else { diff --git a/sysdeps/ieee754/ldbl-96/s_sincosl.c b/sysdeps/ieee754/ldbl-96/s_sincosl.c index c7a161a770..37067bdaeb 100644 --- a/sysdeps/ieee754/ldbl-96/s_sincosl.c +++ b/sysdeps/ieee754/ldbl-96/s_sincosl.c @@ -17,6 +17,7 @@ License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ +#include <errno.h> #include <math.h> #include <math_private.h> @@ -41,6 +42,8 @@ __sincosl (long double x, long double *sinx, long double *cosx) { /* sin(Inf or NaN) is NaN */ *sinx = *cosx = x - x; + if (__isinf_nsl (x)) + __set_errno (EDOM); } else { |