aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2017-09-01 15:14:18 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2017-09-01 15:14:46 -0400
commit9d6b160d7db76809f0c696d9073f6955dd5a973a (patch)
tree5ec2c6e5dd26c060419322f18e1874a240e888cc /src
parenta0572203532560423c92066b90d13383720dce3a (diff)
downloadpostgresql-9d6b160d7db76809f0c696d9073f6955dd5a973a.tar.gz
postgresql-9d6b160d7db76809f0c696d9073f6955dd5a973a.zip
Make [U]INT64CONST safe for use in #if conditions.
Instead of using a cast to force the constant to be the right width, assume we can plaster on an L, UL, LL, or ULL suffix as appropriate. The old approach to this is very hoary, dating from before we were willing to require compilers to have working int64 types. This fix makes the PG_INT64_MIN, PG_INT64_MAX, and PG_UINT64_MAX constants safe to use in preprocessor conditions, where a cast doesn't work. Other symbolic constants that might be defined using [U]INT64CONST are likewise safer than before. Also fix the SIZE_MAX macro to be similarly safe, if we are forced to provide a definition for that. The test added in commit 2e70d6b5e happens to do what we want even with the hack "(size_t) -1" definition, but we could easily get burnt on other tests in future. Back-patch to all supported branches, like the previous commits. Discussion: https://postgr.es/m/15883.1504278595@sss.pgh.pa.us
Diffstat (limited to 'src')
-rw-r--r--src/include/c.h21
-rw-r--r--src/include/pg_config.h.in4
-rw-r--r--src/include/pg_config.h.win328
3 files changed, 11 insertions, 22 deletions
diff --git a/src/include/c.h b/src/include/c.h
index 4f8bbfcd621..4fb8ef0c2ff 100644
--- a/src/include/c.h
+++ b/src/include/c.h
@@ -288,6 +288,8 @@ typedef long int int64;
#ifndef HAVE_UINT64
typedef unsigned long int uint64;
#endif
+#define INT64CONST(x) (x##L)
+#define UINT64CONST(x) (x##UL)
#elif defined(HAVE_LONG_LONG_INT_64)
/* We have working support for "long long int", use that */
@@ -297,20 +299,13 @@ typedef long long int int64;
#ifndef HAVE_UINT64
typedef unsigned long long int uint64;
#endif
+#define INT64CONST(x) (x##LL)
+#define UINT64CONST(x) (x##ULL)
#else
/* neither HAVE_LONG_INT_64 nor HAVE_LONG_LONG_INT_64 */
#error must have a working 64-bit integer datatype
#endif
-/* Decide if we need to decorate 64-bit constants */
-#ifdef HAVE_LL_CONSTANTS
-#define INT64CONST(x) ((int64) x##LL)
-#define UINT64CONST(x) ((uint64) x##ULL)
-#else
-#define INT64CONST(x) ((int64) x)
-#define UINT64CONST(x) ((uint64) x)
-#endif
-
/* snprintf format strings to use for 64-bit integers */
#define INT64_FORMAT "%" INT64_MODIFIER "d"
#define UINT64_FORMAT "%" INT64_MODIFIER "u"
@@ -338,14 +333,18 @@ typedef unsigned PG_INT128_TYPE uint128;
#define PG_UINT16_MAX (0xFFFF)
#define PG_INT32_MIN (-0x7FFFFFFF-1)
#define PG_INT32_MAX (0x7FFFFFFF)
-#define PG_UINT32_MAX (0xFFFFFFFF)
+#define PG_UINT32_MAX (0xFFFFFFFFU)
#define PG_INT64_MIN (-INT64CONST(0x7FFFFFFFFFFFFFFF) - 1)
#define PG_INT64_MAX INT64CONST(0x7FFFFFFFFFFFFFFF)
#define PG_UINT64_MAX UINT64CONST(0xFFFFFFFFFFFFFFFF)
/* Max value of size_t might also be missing if we don't have stdint.h */
#ifndef SIZE_MAX
-#define SIZE_MAX ((size_t) -1)
+#if SIZEOF_SIZE_T == 8
+#define SIZE_MAX PG_UINT64_MAX
+#else
+#define SIZE_MAX PG_UINT32_MAX
+#endif
#endif
/*
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index dcb7a1a3209..579d195663c 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -339,10 +339,6 @@
/* Define to 1 if you have the `z' library (-lz). */
#undef HAVE_LIBZ
-/* Define to 1 if constants of type 'long long int' should have the suffix LL.
- */
-#undef HAVE_LL_CONSTANTS
-
/* Define to 1 if the system has the type `locale_t'. */
#undef HAVE_LOCALE_T
diff --git a/src/include/pg_config.h.win32 b/src/include/pg_config.h.win32
index 0b4110472e2..27aab21be77 100644
--- a/src/include/pg_config.h.win32
+++ b/src/include/pg_config.h.win32
@@ -223,12 +223,6 @@
/* Define to 1 if you have the `z' library (-lz). */
/* #undef HAVE_LIBZ */
-/* Define to 1 if constants of type 'long long int' should have the suffix LL.
- */
-#if (_MSC_VER > 1200)
-#define HAVE_LL_CONSTANTS 1
-#endif
-
/* Define to 1 if the system has the type `locale_t'. */
#define HAVE_LOCALE_T 1
@@ -237,7 +231,7 @@
/* Define to 1 if `long long int' works and is 64 bits. */
#if (_MSC_VER > 1200)
-#define HAVE_LONG_LONG_INT_64
+#define HAVE_LONG_LONG_INT_64 1
#endif
/* Define to 1 if you have the `mbstowcs_l' function. */