From 96294a1436081a09102346ac723b7ed883d8dd5e Mon Sep 17 00:00:00 2001 From: Silas Marvin Date: Sun, 23 Nov 2025 14:39:37 -0800 Subject: [PATCH 1/4] Update PyMemberDescrObject.d_member type --- pyo3-ffi/src/cpython/descrobject.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyo3-ffi/src/cpython/descrobject.rs b/pyo3-ffi/src/cpython/descrobject.rs index 03d64789fa7..e8fe5d56f80 100644 --- a/pyo3-ffi/src/cpython/descrobject.rs +++ b/pyo3-ffi/src/cpython/descrobject.rs @@ -1,4 +1,4 @@ -use crate::{PyGetSetDef, PyMethodDef, PyObject, PyTypeObject}; +use crate::{PyGetSetDef, PyMemberDef, PyMethodDef, PyObject, PyTypeObject}; use std::ffi::{c_char, c_int, c_void}; pub type wrapperfunc = Option< @@ -53,7 +53,7 @@ pub struct PyMethodDescrObject { #[repr(C)] pub struct PyMemberDescrObject { pub d_common: PyDescrObject, - pub d_member: *mut PyGetSetDef, + pub d_member: *mut PyMemberDef, } #[repr(C)] From ddbe5b2a10555c1007379733a9d799abc547a0bc Mon Sep 17 00:00:00 2001 From: Silas Marvin Date: Tue, 25 Nov 2025 11:41:20 -0800 Subject: [PATCH 2/4] Set for correct python versions --- pyo3-ffi/src/cpython/descrobject.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pyo3-ffi/src/cpython/descrobject.rs b/pyo3-ffi/src/cpython/descrobject.rs index e8fe5d56f80..5a7c90def24 100644 --- a/pyo3-ffi/src/cpython/descrobject.rs +++ b/pyo3-ffi/src/cpython/descrobject.rs @@ -53,6 +53,9 @@ pub struct PyMethodDescrObject { #[repr(C)] pub struct PyMemberDescrObject { pub d_common: PyDescrObject, + #[cfg(not(Py_3_11))] + pub d_member: *mut PyGetSetDef, + #[cfg(Py_3_11)] pub d_member: *mut PyMemberDef, } From 2b7035e3164eaf85bc0256cb3d268bd8a07cf4d9 Mon Sep 17 00:00:00 2001 From: Silas Marvin Date: Tue, 25 Nov 2025 12:40:36 -0800 Subject: [PATCH 3/4] Appease clippy and add news fragment --- newsfragments/5647.fixed.md | 1 + pyo3-ffi/src/cpython/descrobject.rs | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 newsfragments/5647.fixed.md diff --git a/newsfragments/5647.fixed.md b/newsfragments/5647.fixed.md new file mode 100644 index 00000000000..3acbd67c9fc --- /dev/null +++ b/newsfragments/5647.fixed.md @@ -0,0 +1 @@ +Fix `PyMemberDescrObject.d_member` type in `pyo3-ffi` to use `PyMemberDef` for Python 3.11+ (was incorrectly `PyGetSetDef`). diff --git a/pyo3-ffi/src/cpython/descrobject.rs b/pyo3-ffi/src/cpython/descrobject.rs index 5a7c90def24..058fb60ba49 100644 --- a/pyo3-ffi/src/cpython/descrobject.rs +++ b/pyo3-ffi/src/cpython/descrobject.rs @@ -1,4 +1,4 @@ -use crate::{PyGetSetDef, PyMemberDef, PyMethodDef, PyObject, PyTypeObject}; +use crate::{PyGetSetDef, PyMethodDef, PyObject, PyTypeObject}; use std::ffi::{c_char, c_int, c_void}; pub type wrapperfunc = Option< @@ -56,7 +56,7 @@ pub struct PyMemberDescrObject { #[cfg(not(Py_3_11))] pub d_member: *mut PyGetSetDef, #[cfg(Py_3_11)] - pub d_member: *mut PyMemberDef, + pub d_member: *mut crate::PyMemberDef, } #[repr(C)] From b066d63691290d43aaaa176f6d41c09ca38e9873 Mon Sep 17 00:00:00 2001 From: Silas Marvin Date: Tue, 25 Nov 2025 12:47:25 -0800 Subject: [PATCH 4/4] Add conditional use --- pyo3-ffi/src/cpython/descrobject.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pyo3-ffi/src/cpython/descrobject.rs b/pyo3-ffi/src/cpython/descrobject.rs index 058fb60ba49..88e952f2c53 100644 --- a/pyo3-ffi/src/cpython/descrobject.rs +++ b/pyo3-ffi/src/cpython/descrobject.rs @@ -1,6 +1,9 @@ use crate::{PyGetSetDef, PyMethodDef, PyObject, PyTypeObject}; use std::ffi::{c_char, c_int, c_void}; +#[cfg(Py_3_11)] +use crate::PyMemberDef; + pub type wrapperfunc = Option< unsafe extern "C" fn( slf: *mut PyObject, @@ -56,7 +59,7 @@ pub struct PyMemberDescrObject { #[cfg(not(Py_3_11))] pub d_member: *mut PyGetSetDef, #[cfg(Py_3_11)] - pub d_member: *mut crate::PyMemberDef, + pub d_member: *mut PyMemberDef, } #[repr(C)]