]> granicus.if.org Git - postgresql/commitdiff
Arrange to supply declarations for strtoll/strtoull if needed.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 19 May 2018 02:42:10 +0000 (22:42 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 19 May 2018 02:42:10 +0000 (22:42 -0400)
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

configure
configure.in
src/include/c.h
src/include/pg_config.h.in
src/include/pg_config.h.win32

index 0aafd9c8c06971cd63dc817b39cee02b4b5aa438..6acbc6e900d6109d4112a751168891e4f99228bf 100755 (executable)
--- a/configure
+++ b/configure
@@ -15734,6 +15734,28 @@ _ACEOF
 fi
 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
   ac_save_CPPFLAGS=$CPPFLAGS
index c3841d5b07fcd42a811b320c06ecbe6849397c45..8ea521a2177b0c76723d2b5778a624e1720967fd 100644 (file)
@@ -1751,6 +1751,8 @@ fi
 
 AC_CHECK_FUNCS([strtoll strtoq], [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
   ac_save_CPPFLAGS=$CPPFLAGS
index 95e9aeded9de242a081d2feaf3ecc517fbcb943b..d88db02c6de58510e2d35e2c967db917aeacd7fb 100644 (file)
@@ -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);
 #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)
 #define memmove(d, s, c)               bcopy(s, d, c)
 #endif
index 9411f485121a24a38cfd4cf8a12dc7d4bf07ea9a..e2ffaa28a0a5030d11c23e6671cac289572cf602 100644 (file)
    don't. */
 #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
    don't. */
 #undef HAVE_DECL_SYS_SIGLIST
index a62bcac64e259341de4038735fd6e0da89ff6a88..1a63dc4dc9a772eadb350daf8a2fae3c6cb58a2d 100644 (file)
    don't. */
 #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
    don't. */
 #define HAVE_DECL_VSNPRINTF 1