From 881d5d5db08ee6b343e1f1fc560d785fed29428e Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Wed, 4 Feb 2015 20:31:17 +0100 Subject: [PATCH] Fix Python 3 build error on 32-bit hosts MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit on Fedora Rawhide (==22) i686 using --with-python=/usr/bin/python3 one gets: ./python/py-value.c:1696:3: error: initialization from incompatible pointer type [-Werror] valpy_hash, /*tp_hash*/ ^ ./python/py-value.c:1696:3: error: (near initialization for ‘value_object_type.tp_hash’) [-Werror] cc1: all warnings being treated as errors Makefile:2628: recipe for target 'py-value.o' failed This is because in Python 2 tp_hash was: typedef long (*hashfunc)(PyObject *); while in Python 3 tp_hash is: typedef Py_hash_t (*hashfunc)(PyObject *); Py_hash_t is int for 32-bit hosts and long for 64-bit hosts. While on 32-bit hosts sizeof(long)==sizeof(int) still the hashfunc type is formally incompatible. As this patch should have no compiled code change it is not really necessary for gdb-7.9, it would fix there just this non-fatal compilation warning: ./python/py-value.c:1696:3: warning: initialization from incompatible pointer type valpy_hash, /*tp_hash*/ ^ ./python/py-value.c:1696:3: warning: (near initialization for ‘value_object_type.tp_hash’) gdb/ChangeLog 2015-02-04 Jan Kratochvil * python/python-internal.h (Py_hash_t): Define it for Python <3.2. * python/py-value.c (valpy_fetch_lazy): Use it. Remove cast to the return type. --- gdb/ChangeLog | 6 ++++++ gdb/python/py-value.c | 4 ++-- gdb/python/python-internal.h | 4 ++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index aae6a7c65fb..cd1c9d7c0a7 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2015-02-04 Jan Kratochvil + + * python/python-internal.h (Py_hash_t): Define it for Python <3.2. + * python/py-value.c (valpy_fetch_lazy): Use it. Remove cast to the + return type. + 2015-02-04 Pedro Alves * linux-nat.c (handle_extended_wait): Don't resume LWPs here. diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c index 4c4d36ec4b4..5a1377756a1 100644 --- a/gdb/python/py-value.c +++ b/gdb/python/py-value.c @@ -895,10 +895,10 @@ valpy_fetch_lazy (PyObject *self, PyObject *args) /* Calculate and return the address of the PyObject as the value of the builtin __hash__ call. */ -static long +static Py_hash_t valpy_hash (PyObject *self) { - return (long) (intptr_t) self; + return (intptr_t) self; } enum valpy_opcode diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h index 0ee85440fb4..a77f5a66267 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h @@ -169,6 +169,10 @@ typedef unsigned long gdb_py_ulongest; #endif /* HAVE_LONG_LONG */ +#if PY_VERSION_HEX < 0x03020000 +typedef long Py_hash_t; +#endif + /* Python 2.6 did not wrap Py_DECREF in 'do {...} while (0)', leading to 'suggest explicit braces to avoid ambiguous ‘else’' gcc errors. Wrap it ourselves, so that callers don't need to care. */ -- 2.30.2