summaryrefslogtreecommitdiff
path: root/ext/standard
diff options
context:
space:
mode:
authorChristian Schmidt <cs@blackwoodseven.com>2017-02-02 18:52:27 +0100
committerNikita Popov <nikita.ppv@gmail.com>2017-02-08 00:53:18 +0100
commit714d825b62e719447686da6efe3b4063c2f25749 (patch)
treeb1984176e18d1eff378f7bf226b4ccb9bf4e34cb /ext/standard
parent044dd30440eb46378288c02d15573f21f17ec927 (diff)
downloadphp-git-714d825b62e719447686da6efe3b4063c2f25749.tar.gz
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.
Diffstat (limited to 'ext/standard')
-rw-r--r--ext/standard/config.m415
-rw-r--r--ext/standard/tests/math/bug74039.phpt28
2 files changed, 36 insertions, 7 deletions
diff --git a/ext/standard/config.m4 b/ext/standard/config.m4
index ec90af9227..8360cc1552 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 0000000000..dd0e1fa260
--- /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)