From fb655e0c4581ca4bed80db0a083884b29fe142d2 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 14 Jun 2023 12:12:25 +0200 Subject: _ctypes callbacks.c uses _Py_COMP_DIAG_IGNORE_DEPR_DECLS (#105732) Replace #pragma with _Py_COMP_DIAG_PUSH, _Py_COMP_DIAG_IGNORE_DEPR_DECLS and _Py_COMP_DIAG_POP to ease Python maintenance. Also add a comment explaining why callbacks.c ignores a deprecation warning. --- Modules/_ctypes/callbacks.c | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/Modules/_ctypes/callbacks.c b/Modules/_ctypes/callbacks.c index d71297f..0d8ecce 100644 --- a/Modules/_ctypes/callbacks.c +++ b/Modules/_ctypes/callbacks.c @@ -416,25 +416,29 @@ CThunkObject *_ctypes_alloc_callback(PyObject *callable, PyErr_Format(PyExc_NotImplementedError, "ffi_prep_closure_loc() is missing"); goto error; #else -#if defined(__clang__) - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wdeprecated-declarations" -#endif -#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#endif + // GH-85272, GH-23327, GH-100540: On macOS, + // HAVE_FFI_PREP_CLOSURE_LOC_RUNTIME is checked at runtime because the + // symbol might not be available at runtime when targeting macOS 10.14 + // or earlier. Even if ffi_prep_closure_loc() is called in practice, + // the deprecated ffi_prep_closure() code path is needed if + // HAVE_FFI_PREP_CLOSURE_LOC_RUNTIME is false. + // + // On non-macOS platforms, even if HAVE_FFI_PREP_CLOSURE_LOC_RUNTIME is + // defined as 1 and ffi_prep_closure_loc() is used in practice, this + // code path is still compiled and emits a compiler warning. The + // deprecated code path is likely to be removed by a simple + // optimization pass. + // + // Ignore the compiler warning on the ffi_prep_closure() deprecation, + // rather than using complex #if/#else code paths for the different + // platforms. + _Py_COMP_DIAG_PUSH + _Py_COMP_DIAG_IGNORE_DEPR_DECLS result = ffi_prep_closure(p->pcl_write, &p->cif, closure_fcn, p); - -#if defined(__clang__) - #pragma clang diagnostic pop -#endif -#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) - #pragma GCC diagnostic pop -#endif - + _Py_COMP_DIAG_POP #endif } + if (result != FFI_OK) { PyErr_Format(PyExc_RuntimeError, "ffi_prep_closure failed with %d", result); -- cgit v0.12