Commit a8fa3f14 authored by unknown's avatar unknown

Fix for bug #28240: "isinf()" cannot be used in C++ for lack of prototype

- Since isinf() portability across various platforms and
  compilers is a complicated question, we should not use
  it directly. Instead, the my_isinf() macro should be used,
  which is defined as an alias to the system-defined isinf()
  if it is safe to use, or a workaround implementation otherwise


configure.in:
  Added a check to define HAVE_ISINF only if it can be used
  in C++ code as well.
include/my_global.h:
  Define my_isinf() as an alias to isinf(), if it is available
  in both C and C++ code. Otherwise, define it to a workaround
  implementation.
sql/item_func.cc:
  Replaced isinf() with my_isinf().
strings/strtod.c:
  Replaced isinf() with my_isinf().
parent 4ce317e5
...@@ -2006,12 +2006,20 @@ case "$target" in ...@@ -2006,12 +2006,20 @@ case "$target" in
;; ;;
esac esac
# isinf() could be a function or a macro (HPUX) # Check that isinf() is available in math.h and can be used in both C and C++
AC_MSG_CHECKING(for isinf with <math.h>) # code
AC_MSG_CHECKING(for isinf in <math.h>)
AC_TRY_LINK([#include <math.h>], [float f = 0.0; int r = isinf(f); return r], AC_TRY_LINK([#include <math.h>], [float f = 0.0; int r = isinf(f); return r],
AC_MSG_RESULT(yes)
AC_MSG_CHECKING(whether isinf() can be used in C++ code)
AC_LANG_SAVE
AC_LANG_CPLUSPLUS
AC_TRY_LINK([#include <math.h>], [float f = 0.0; int r = isinf(f); return r],
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_ISINF, [1], [isinf() macro or function]), AC_DEFINE(HAVE_ISINF, [1], [isinf() macro or function]),
AC_MSG_RESULT(no)) AC_MSG_RESULT(no))
AC_LANG_RESTORE,
AC_MSG_RESULT(no))
CFLAGS="$ORG_CFLAGS" CFLAGS="$ORG_CFLAGS"
......
...@@ -792,12 +792,11 @@ typedef SOCKET_SIZE_TYPE size_socket; ...@@ -792,12 +792,11 @@ typedef SOCKET_SIZE_TYPE size_socket;
#define isnan(x) ((x) != (x)) #define isnan(x) ((x) != (x))
#endif #endif
#if !defined(HAVE_ISINF) #ifdef HAVE_ISINF
/* The configure check for "isinf with math.h" has failed */ /* isinf() can be used in both C and C++ code */
#ifdef isinf #define my_isinf(X) isinf(X)
#undef isinf #else
#endif #define my_isinf(X) (!finite(X) && !isnan(X))
#define isinf(X) (!finite(X) && !isnan(X))
#endif #endif
/* Define missing math constants. */ /* Define missing math constants. */
......
...@@ -1980,9 +1980,9 @@ double my_double_round(double value, longlong dec, bool dec_unsigned, ...@@ -1980,9 +1980,9 @@ double my_double_round(double value, longlong dec, bool dec_unsigned,
tmp=(abs_dec < array_elements(log_10) ? tmp=(abs_dec < array_elements(log_10) ?
log_10[abs_dec] : pow(10.0,(double) abs_dec)); log_10[abs_dec] : pow(10.0,(double) abs_dec));
if (dec_negative && isinf(tmp)) if (dec_negative && my_isinf(tmp))
tmp2= 0; tmp2= 0;
else if (!dec_negative && isinf(value * tmp)) else if (!dec_negative && my_isinf(value * tmp))
tmp2= value; tmp2= value;
else if (truncate) else if (truncate)
{ {
......
...@@ -194,7 +194,7 @@ double my_strtod(const char *str, char **end_ptr, int *error) ...@@ -194,7 +194,7 @@ double my_strtod(const char *str, char **end_ptr, int *error)
done: done:
*end_ptr= (char*) str; /* end of number */ *end_ptr= (char*) str; /* end of number */
if (overflow || isinf(result)) if (overflow || my_isinf(result))
{ {
result= DBL_MAX; result= DBL_MAX;
*error= EOVERFLOW; *error= EOVERFLOW;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment