summaryrefslogtreecommitdiffstats
path: root/Include/pyport.h
diff options
context:
space:
mode:
authorMark Dickinson <dickinsm@gmail.com>2010-11-20 10:43:10 (GMT)
committerMark Dickinson <dickinsm@gmail.com>2010-11-20 10:43:10 (GMT)
commit6646cd45be26c532a1152cea6a6e0ba27838c645 (patch)
tree2a39c18e75f9bd0c0d1043a2b717bd37b926eda1 /Include/pyport.h
parentec0d3558360c5232c066094127b4d88f55c0b531 (diff)
downloadcpython-6646cd45be26c532a1152cea6a6e0ba27838c645.zip
cpython-6646cd45be26c532a1152cea6a6e0ba27838c645.tar.gz
cpython-6646cd45be26c532a1152cea6a6e0ba27838c645.tar.bz2
Issue #10325: Fix two issues in the fallback definitions of PY_LLONG_MAX and
PY_ULLONG_MAX in pyport.h. Thanks Hallvard B Furuseth for the patch.
Diffstat (limited to 'Include/pyport.h')
-rw-r--r--Include/pyport.h21
1 files changed, 13 insertions, 8 deletions
diff --git a/Include/pyport.h b/Include/pyport.h
index 568199b..62aa53a 100644
--- a/Include/pyport.h
+++ b/Include/pyport.h
@@ -62,15 +62,20 @@ Used in: PY_LONG_LONG
#define PY_LLONG_MAX LLONG_MAX
#define PY_ULLONG_MAX ULLONG_MAX
#elif defined(__LONG_LONG_MAX__)
-/* Otherwise, if GCC has a builtin define, use that. */
+/* Otherwise, if GCC has a builtin define, use that. (Definition of
+ * PY_LLONG_MIN assumes two's complement with no trap representation.) */
#define PY_LLONG_MAX __LONG_LONG_MAX__
-#define PY_LLONG_MIN (-PY_LLONG_MAX-1)
-#define PY_ULLONG_MAX (__LONG_LONG_MAX__*2ULL + 1ULL)
-#else
-/* Otherwise, rely on two's complement. */
-#define PY_ULLONG_MAX (~0ULL)
-#define PY_LLONG_MAX ((long long)(PY_ULLONG_MAX>>1))
-#define PY_LLONG_MIN (-PY_LLONG_MAX-1)
+#define PY_LLONG_MIN (-PY_LLONG_MAX - 1)
+#define PY_ULLONG_MAX (PY_LLONG_MAX * Py_ULL(2) + 1)
+#elif defined(SIZEOF_LONG_LONG)
+/* Otherwise compute from SIZEOF_LONG_LONG, assuming two's complement, no
+ padding bits, and no trap representation. Note: PY_ULLONG_MAX was
+ previously #defined as (~0ULL) here; but that'll give the wrong value in a
+ preprocessor expression on systems where long long != intmax_t. */
+#define PY_LLONG_MAX \
+ (1 + 2 * ((Py_LL(1) << (CHAR_BIT * SIZEOF_LONG_LONG - 2)) - 1))
+#define PY_LLONG_MIN (-PY_LLONG_MAX - 1)
+#define PY_ULLONG_MAX (PY_LLONG_MAX * Py_ULL(2) + 1)
#endif /* LLONG_MAX */
#endif
#endif /* HAVE_LONG_LONG */