Commit a6228128 authored by Tom Lane's avatar Tom Lane

Arrange to supply declarations for strtoll/strtoull if needed.

Buildfarm member dromedary is still unhappy about the recently-added
ecpg "long long" tests.  The reason turns out to be that it includes
"-ansi" in its CFLAGS, and in their infinite wisdom Apple have decided
to hide the declarations of strtoll/strtoull in C89-compliant builds.
(I find it pretty curious that they hide those function declarations
when you can nonetheless declare a "long long" variable, but anyway
that is their behavior, both on dromedary's obsolete macOS version and
the newest and shiniest.)  As a result, gcc assumes these functions
return "int", leading naturally to wrong results.

(Looking at dromedary's past build results, it's evident that this
problem also breaks pg_strtouint64() on 32-bit platforms; but we
evidently have no regression tests that exercise that function with
values above 32 bits.)

To fix, supply declarations for these functions when the platform
provides the functions but not the declarations, using the same type
of mechanism as we use for some other similar cases.

Discussion: https://postgr.es/m/151935568942.1461.14623890240535309745@wrigleys.postgresql.org
parent e2b83ff5
...@@ -15734,6 +15734,28 @@ _ACEOF ...@@ -15734,6 +15734,28 @@ _ACEOF
fi fi
done done
# strto[u]ll may exist but not be declared
ac_fn_c_check_decl "$LINENO" "strtoll" "ac_cv_have_decl_strtoll" "$ac_includes_default"
if test "x$ac_cv_have_decl_strtoll" = xyes; then :
ac_have_decl=1
else
ac_have_decl=0
fi
cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_STRTOLL $ac_have_decl
_ACEOF
ac_fn_c_check_decl "$LINENO" "strtoull" "ac_cv_have_decl_strtoull" "$ac_includes_default"
if test "x$ac_cv_have_decl_strtoull" = xyes; then :
ac_have_decl=1
else
ac_have_decl=0
fi
cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_STRTOULL $ac_have_decl
_ACEOF
if test "$with_icu" = yes; then if test "$with_icu" = yes; then
ac_save_CPPFLAGS=$CPPFLAGS ac_save_CPPFLAGS=$CPPFLAGS
......
...@@ -1751,6 +1751,8 @@ fi ...@@ -1751,6 +1751,8 @@ fi
AC_CHECK_FUNCS([strtoll strtoq], [break]) AC_CHECK_FUNCS([strtoll strtoq], [break])
AC_CHECK_FUNCS([strtoull strtouq], [break]) AC_CHECK_FUNCS([strtoull strtouq], [break])
# strto[u]ll may exist but not be declared
AC_CHECK_DECLS([strtoll, strtoull])
if test "$with_icu" = yes; then if test "$with_icu" = yes; then
ac_save_CPPFLAGS=$CPPFLAGS ac_save_CPPFLAGS=$CPPFLAGS
......
...@@ -1096,6 +1096,14 @@ extern int snprintf(char *str, size_t count, const char *fmt,...) pg_attribute_p ...@@ -1096,6 +1096,14 @@ extern int snprintf(char *str, size_t count, const char *fmt,...) pg_attribute_p
extern int vsnprintf(char *str, size_t count, const char *fmt, va_list args); extern int vsnprintf(char *str, size_t count, const char *fmt, va_list args);
#endif #endif
#if defined(HAVE_LONG_LONG_INT) && defined(HAVE_STRTOLL) && !HAVE_DECL_STRTOLL
extern long long strtoll(const char *str, char **endptr, int base);
#endif
#if defined(HAVE_LONG_LONG_INT) && defined(HAVE_STRTOULL) && !HAVE_DECL_STRTOULL
extern unsigned long long strtoull(const char *str, char **endptr, int base);
#endif
#if !defined(HAVE_MEMMOVE) && !defined(memmove) #if !defined(HAVE_MEMMOVE) && !defined(memmove)
#define memmove(d, s, c) bcopy(s, d, c) #define memmove(d, s, c) bcopy(s, d, c)
#endif #endif
......
...@@ -170,6 +170,14 @@ ...@@ -170,6 +170,14 @@
don't. */ don't. */
#undef HAVE_DECL_STRNLEN #undef HAVE_DECL_STRNLEN
/* Define to 1 if you have the declaration of `strtoll', and to 0 if you
don't. */
#undef HAVE_DECL_STRTOLL
/* Define to 1 if you have the declaration of `strtoull', and to 0 if you
don't. */
#undef HAVE_DECL_STRTOULL
/* Define to 1 if you have the declaration of `sys_siglist', and to 0 if you /* Define to 1 if you have the declaration of `sys_siglist', and to 0 if you
don't. */ don't. */
#undef HAVE_DECL_SYS_SIGLIST #undef HAVE_DECL_SYS_SIGLIST
......
...@@ -122,6 +122,14 @@ ...@@ -122,6 +122,14 @@
don't. */ don't. */
#define HAVE_DECL_STRNLEN 1 #define HAVE_DECL_STRNLEN 1
/* Define to 1 if you have the declaration of `strtoll', and to 0 if you
don't. */
#define HAVE_DECL_STRTOLL 1
/* Define to 1 if you have the declaration of `strtoull', and to 0 if you
don't. */
#define HAVE_DECL_STRTOULL 1
/* Define to 1 if you have the declaration of `vsnprintf', and to 0 if you /* Define to 1 if you have the declaration of `vsnprintf', and to 0 if you
don't. */ don't. */
#define HAVE_DECL_VSNPRINTF 1 #define HAVE_DECL_VSNPRINTF 1
......
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