com php-src: Fix detection of isnan and isinf: NEWS Zend/Zend.m4 Zend/configure.in configure.in ext/standard/config.m4
ext/standard/tests/math/bug74039.phpt
| From: | Nikita Popov | Date: | Tue, 07 Feb 2017 23:53:18 +0000 |
| Subject: | com php-src: Fix detection of isnan and isinf: NEWS Zend/Zend.m4 Zend/configure.in configure.in ext/standard/config.m4 ext/standard/tests/math/bug74039.phpt |
||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-97039@lists.php.net to get a copy of this message | ||
Commit: 714d825b62e719447686da6efe3b4063c2f25749
Author: Christian Schmidt <cs@blackwoodseven.com> Thu, 2 Feb 2017 18:52:27 +0100
Committer: Nikita Popov <nikita.ppv@gmail.com> Wed, 8 Feb 2017 00:53:18 +0100
Parents: 044dd30440eb46378288c02d15573f21f17ec927
Branches: PHP-7.0 PHP-7.1 master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=714d825b62e719447686da6efe3b4063c2f25749
Log:
Fix detection of isnan and isinf
The isnan() and isinf() are C99 macros not functions.
Also fix is_infinite(-INF) in case isinf is not defined.
Changed paths:
M NEWS
M Zend/Zend.m4
M Zend/configure.in
M configure.in
M ext/standard/config.m4
A ext/standard/tests/math/bug74039.phpt
Diff:
diff --git a/NEWS b/NEWS
index adc80db..4346259 100644
--- a/NEWS
+++ b/NEWS
@@ -8,6 +8,7 @@ PHP NEWS
.. Fixed bug #73998 (array_key_exists fails on arrays created by
get_object_vars). (mhagstrand)
. Fixed bug #73954 (NAN check fails on Alpine Linux with musl). (Andrea)
+ . Fixed bug #74039 (is_infinite(-INF) returns false). (Christian Schmidt)
- GD:
. Fixed bug #74031 (ReflectionFunction for imagepng is missing last two
diff --git a/Zend/Zend.m4 b/Zend/Zend.m4
index bdeac67..fd2b85d 100644
--- a/Zend/Zend.m4
+++ b/Zend/Zend.m4
@@ -100,7 +100,7 @@ AC_FUNC_ALLOCA
AC_CHECK_FUNCS(memcpy strdup getpid kill strtod strtol finite fpclass sigsetjmp)
AC_ZEND_BROKEN_SPRINTF
-AC_CHECK_FUNCS(finite isfinite isinf isnan)
+AC_CHECK_DECLS([isfinite, isnan, isinf], [], [], [[#include <math.h>]])
ZEND_FP_EXCEPT
diff --git a/Zend/configure.in b/Zend/configure.in
index 3c79151..ec339ea 100644
--- a/Zend/configure.in
+++ b/Zend/configure.in
@@ -64,13 +64,13 @@ int zend_sprintf(char *buffer, const char *format, ....);
/* To enable the is_nan, is_infinite and is_finite PHP functions */
#ifdef NETWARE
- #define HAVE_ISNAN 1
- #define HAVE_ISINF 1
- #define HAVE_ISFINITE 1
+ #define HAVE_DECL_ISNAN 1
+ #define HAVE_DECL_ISINF 1
+ #define HAVE_DECL_ISFINITE 1
#endif
#ifndef zend_isnan
-#ifdef HAVE_ISNAN
+#ifdef HAVE_DECL_ISNAN
#define zend_isnan(a) isnan(a)
#elif defined(HAVE_FPCLASS)
#define zend_isnan(a) ((fpclass(a) == FP_SNAN) || (fpclass(a) == FP_QNAN))
@@ -79,18 +79,18 @@ int zend_sprintf(char *buffer, const char *format, ...);
#endif
#endif
-#ifdef HAVE_ISINF
+#ifdef HAVE_DECL_ISINF
#define zend_isinf(a) isinf(a)
#elif defined(INFINITY)
/* Might not work, but is required by ISO C99 */
-#define zend_isinf(a) (((a)==INFINITY)?1:0)
+#define zend_isinf(a) (((a)==INFINITY || (a)==-INFINITY)?1:0)
#elif defined(HAVE_FPCLASS)
#define zend_isinf(a) ((fpclass(a) == FP_PINF) || (fpclass(a) == FP_NINF))
#else
#define zend_isinf(a) 0
#endif
-#if defined(HAVE_ISFINITE) || defined(isfinite)
+#if defined(HAVE_DECL_ISFINITE)
#define zend_finite(a) isfinite(a)
#elif defined(HAVE_FINITE)
#define zend_finite(a) finite(a)
diff --git a/configure.in b/configure.in
index b5a3919..b90f535 100644
--- a/configure.in
+++ b/configure.in
@@ -69,13 +69,13 @@ int zend_sprintf(char *buffer, const char *format, ...);
/* To enable the is_nan, is_infinite and is_finite PHP functions */
#ifdef NETWARE
- #define HAVE_ISNAN 1
- #define HAVE_ISINF 1
- #define HAVE_ISFINITE 1
+ #define HAVE_DECL_ISNAN 1
+ #define HAVE_DECL_ISINF 1
+ #define HAVE_DECL_ISFINITE 1
#endif
#ifndef zend_isnan
-#ifdef HAVE_ISNAN
+#ifdef HAVE_DECL_ISNAN
#define zend_isnan(a) isnan(a)
#elif defined(HAVE_FPCLASS)
#define zend_isnan(a) ((fpclass(a) == FP_SNAN) || (fpclass(a) == FP_QNAN))
@@ -84,18 +84,18 @@ int zend_sprintf(char *buffer, const char *format, ...);
#endif
#endif
-#ifdef HAVE_ISINF
+#ifdef HAVE_DECL_ISINF
#define zend_isinf(a) isinf(a)
#elif defined(INFINITY)
/* Might not work, but is required by ISO C99 */
-#define zend_isinf(a) (((a)==INFINITY)?1:0)
+#define zend_isinf(a) (((a)==INFINITY || (a)==-INFINITY)?1:0)
#elif defined(HAVE_FPCLASS)
#define zend_isinf(a) ((fpclass(a) == FP_PINF) || (fpclass(a) == FP_NINF))
#else
#define zend_isinf(a) 0
#endif
-#if defined(HAVE_ISFINITE) || defined(isfinite)
+#if defined(HAVE_DECL_ISFINITE)
#define zend_finite(a) isfinite(a)
#elif defined(HAVE_FINITE)
#define zend_finite(a) finite(a)
diff --git a/ext/standard/config.m4 b/ext/standard/config.m4
index ec90af9..8360cc1 100644
--- a/ext/standard/config.m4
+++ b/ext/standard/config.m4
@@ -349,7 +349,8 @@ dnl Check for available functions
dnl
dnl log2 could be used to improve the log function, however it requires C99. The check for log2
should be turned on,
dnl as soon as we support C99.
-AC_CHECK_FUNCS(getcwd getwd asinh acosh atanh log1p hypot glob strfmon nice fpclass isinf isnan
mempcpy strpncpy)
+AC_CHECK_FUNCS(getcwd getwd asinh acosh atanh log1p hypot glob strfmon nice fpclass mempcpy
strpncpy)
+AC_CHECK_DECLS([isnan, isinf], [], [], [[#include <math.h>]])
AC_FUNC_FNMATCH
dnl
@@ -420,7 +421,7 @@ AC_TRY_RUN([
#include <math.h>
#include <stdlib.h>
-#ifdef HAVE_ISNAN
+#ifdef HAVE_DECL_ISNAN
#define zend_isnan(a) isnan(a)
#elif defined(HAVE_FPCLASS)
#define zend_isnan(a) ((fpclass(a) == FP_SNAN) || (fpclass(a) == FP_QNAN))
@@ -451,11 +452,11 @@ AC_TRY_RUN([
#include <math.h>
#include <stdlib.h>
-#ifdef HAVE_ISINF
+#ifdef HAVE_DECL_ISINF
#define zend_isinf(a) isinf(a)
#elif defined(INFINITY)
/* Might not work, but is required by ISO C99 */
-#define zend_isinf(a) (((a)==INFINITY)?1:0)
+#define zend_isinf(a) (((a)==INFINITY || (a)==-INFINITY)?1:0)
#elif defined(HAVE_FPCLASS)
#define zend_isinf(a) ((fpclass(a) == FP_PINF) || (fpclass(a) == FP_NINF))
#else
@@ -485,11 +486,11 @@ AC_TRY_RUN([
#include <math.h>
#include <stdlib.h>
-#ifdef HAVE_ISINF
+#ifdef HAVE_DECL_ISINF
#define zend_isinf(a) isinf(a)
#elif defined(INFINITY)
/* Might not work, but is required by ISO C99 */
-#define zend_isinf(a) (((a)==INFINITY)?1:0)
+#define zend_isinf(a) (((a)==INFINITY || (a)==-INFINITY)?1:0)
#elif defined(HAVE_FPCLASS)
#define zend_isinf(a) ((fpclass(a) == FP_PINF) || (fpclass(a) == FP_NINF))
#else
@@ -520,7 +521,7 @@ AC_TRY_RUN([
#include <math.h>
#include <stdlib.h>
-#ifdef HAVE_ISNAN
+#ifdef HAVE_DECL_ISNAN
#define zend_isnan(a) isnan(a)
#elif defined(HAVE_FPCLASS)
#define zend_isnan(a) ((fpclass(a) == FP_SNAN) || (fpclass(a) == FP_QNAN))
diff --git a/ext/standard/tests/math/bug74039.phpt b/ext/standard/tests/math/bug74039.phpt
new file mode 100644
index 0000000..dd0e1fa
--- /dev/null
+++ b/ext/standard/tests/math/bug74039.phpt
@@ -0,0 +1,28 @@
+--TEST--
+Bug #74039: is_infinite(-INF) returns false
+--FILE--
+<?php
+
+var_dump(is_finite(INF));
+var_dump(is_infinite(INF));
+var_dump(is_nan(INF));
+
+var_dump(is_finite(-INF));
+var_dump(is_infinite(-INF));
+var_dump(is_nan(-INF));
+
+var_dump(is_finite(NAN));
+var_dump(is_infinite(NAN));
+var_dump(is_nan(NAN));
+
+?>
+--EXPECT--
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+bool(false)
+bool(true)