summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <msvensson@pilot.blaudden>2007-05-16 10:10:02 +0200
committerunknown <msvensson@pilot.blaudden>2007-05-16 10:10:02 +0200
commit9e1585ab8f487222a03e017079efadb570817657 (patch)
tree222a34ab17c278e1e03ef3231ddf4cf2cdecf09b
parente9e6b9e477fbb5920ba929e0851eb0d4e50ec7aa (diff)
downloadmariadb-git-9e1585ab8f487222a03e017079efadb570817657.tar.gz
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().
-rw-r--r--configure.in18
-rw-r--r--include/my_global.h11
-rw-r--r--sql/item_func.cc4
-rw-r--r--strings/strtod.c2
4 files changed, 21 insertions, 14 deletions
diff --git a/configure.in b/configure.in
index 1026c855bf2..e788419eb4f 100644
--- a/configure.in
+++ b/configure.in
@@ -2006,12 +2006,20 @@ case "$target" in
;;
esac
-# isinf() could be a function or a macro (HPUX)
-AC_MSG_CHECKING(for isinf with <math.h>)
+# Check that isinf() is available in math.h and can be used in both C and C++
+# 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_MSG_RESULT(yes)
- AC_DEFINE(HAVE_ISINF, [1], [isinf() macro or function]),
- AC_MSG_RESULT(no))
+ 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_DEFINE(HAVE_ISINF, [1], [isinf() macro or function]),
+ AC_MSG_RESULT(no))
+ AC_LANG_RESTORE,
+ AC_MSG_RESULT(no))
CFLAGS="$ORG_CFLAGS"
diff --git a/include/my_global.h b/include/my_global.h
index e9b371d8d30..f32a987ffb1 100644
--- a/include/my_global.h
+++ b/include/my_global.h
@@ -792,12 +792,11 @@ typedef SOCKET_SIZE_TYPE size_socket;
#define isnan(x) ((x) != (x))
#endif
-#if !defined(HAVE_ISINF)
-/* The configure check for "isinf with math.h" has failed */
-#ifdef isinf
-#undef isinf
-#endif
-#define isinf(X) (!finite(X) && !isnan(X))
+#ifdef HAVE_ISINF
+/* isinf() can be used in both C and C++ code */
+#define my_isinf(X) isinf(X)
+#else
+#define my_isinf(X) (!finite(X) && !isnan(X))
#endif
/* Define missing math constants. */
diff --git a/sql/item_func.cc b/sql/item_func.cc
index 14a4c4dcf4b..adb512ec0e9 100644
--- a/sql/item_func.cc
+++ b/sql/item_func.cc
@@ -1980,9 +1980,9 @@ double my_double_round(double value, longlong dec, bool dec_unsigned,
tmp=(abs_dec < array_elements(log_10) ?
log_10[abs_dec] : pow(10.0,(double) abs_dec));
- if (dec_negative && isinf(tmp))
+ if (dec_negative && my_isinf(tmp))
tmp2= 0;
- else if (!dec_negative && isinf(value * tmp))
+ else if (!dec_negative && my_isinf(value * tmp))
tmp2= value;
else if (truncate)
{
diff --git a/strings/strtod.c b/strings/strtod.c
index 15707a9b944..7196cafb2c9 100644
--- a/strings/strtod.c
+++ b/strings/strtod.c
@@ -194,7 +194,7 @@ double my_strtod(const char *str, char **end_ptr, int *error)
done:
*end_ptr= (char*) str; /* end of number */
- if (overflow || isinf(result))
+ if (overflow || my_isinf(result))
{
result= DBL_MAX;
*error= EOVERFLOW;