]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix sincos errno setting (bug 15467).
authorJoseph Myers <joseph@codesourcery.com>
Wed, 11 Feb 2015 23:17:25 +0000 (23:17 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Wed, 11 Feb 2015 23:17:25 +0000 (23:17 +0000)
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.

ChangeLog
NEWS
math/libm-test.inc
sysdeps/ieee754/dbl-64/s_sincos.c
sysdeps/ieee754/flt-32/s_sincosf.c
sysdeps/ieee754/ldbl-128/s_sincosl.c
sysdeps/ieee754/ldbl-128ibm/s_sincosl.c
sysdeps/ieee754/ldbl-96/s_sincosl.c

index fd890c5690130c3c16ddd81c3732760b95d3fa3c..c61a392255f076ef3f67c8d5f16b79aff8bef7a6 100644 (file)
--- 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 d85e26fdd2dd620a3b9d238e80e5049856b28df8..2d4ebb951bd0a0a5c02891ab893db765cad90109 100644 (file)
--- 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.
 \f
 Version 2.21
 
index 6d7ff12e044e63ec36e86bb53a4de7ed86dfc3f3..aa7ba2b765f0b94edbaa35a8b36418de31fda021 100644 (file)
@@ -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),
   };
index 7d3b10139f71e02d2423e11e47848fd8affa85d9..c8a99991cc8d47dcb56c7a9d6ca817db9cf2223c 100644 (file)
@@ -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
     {
index 5cf5db03cb9d91c2691dea7bc7c7a4f8ff788247..596e076609d9514c967ee5e929f1e7130ea2a57e 100644 (file)
@@ -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
     {
index 175a617d1a3c45a7783f3dbaf4e685b4bd675a54..6c4cbd72370fb97e7fbdcf8d179dc7b6042e9425 100644 (file)
@@ -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
     {
index f52e73385d3646427267558eda0477874a73b506..8a49c54d6cba99fbc02624a96879f01f911481bd 100644 (file)
@@ -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
     {
index c7a161a77000b0b6eed7765c659671f3a8fdd1bf..37067bdaebe72e85c20f86a459afadfee9d2d7ad 100644 (file)
@@ -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
     {