mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
gh-93442: Make C++ version of _Py_CAST work with 0/NULL. (GH-93500) (gh-93507)
Add C++ overloads for _Py_CAST_impl() to handle 0/NULL. This will allow
C++ extensions that pass 0 or NULL to macros using _Py_CAST() to
continue to compile. Without this, you get an error like:
invalid ‘static_cast’ from type ‘int’ to type ‘_object*’
The modern way to use a NULL value in C++ is to use nullptr. However,
we want to not break extensions that do things the old way.
Co-authored-by: serge-sans-paille
(cherry picked from commit 8bcc3fa345
)
Co-authored-by: Neil Schemenauer <nas-github@arctrix.com>
Co-authored-by: Neil Schemenauer <nas-github@arctrix.com>
This commit is contained in:
parent
4443c285a6
commit
d97e2c52d3
3 changed files with 21 additions and 0 deletions
|
@ -24,9 +24,23 @@
|
|||
//
|
||||
// The type argument must not be a constant type.
|
||||
#ifdef __cplusplus
|
||||
#include <cstddef>
|
||||
# define _Py_STATIC_CAST(type, expr) static_cast<type>(expr)
|
||||
extern "C++" {
|
||||
namespace {
|
||||
template <typename type>
|
||||
inline type _Py_CAST_impl(long int ptr) {
|
||||
return reinterpret_cast<type>(ptr);
|
||||
}
|
||||
template <typename type>
|
||||
inline type _Py_CAST_impl(int ptr) {
|
||||
return reinterpret_cast<type>(ptr);
|
||||
}
|
||||
template <typename type>
|
||||
inline type _Py_CAST_impl(std::nullptr_t) {
|
||||
return static_cast<type>(nullptr);
|
||||
}
|
||||
|
||||
template <typename type, typename expr_type>
|
||||
inline type _Py_CAST_impl(expr_type *expr) {
|
||||
return reinterpret_cast<type>(expr);
|
||||
|
|
|
@ -74,6 +74,10 @@ test_api_casts(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args))
|
|||
Py_INCREF(strong_ref);
|
||||
Py_DECREF(strong_ref);
|
||||
|
||||
// gh-93442: Pass 0 as NULL for PyObject*
|
||||
Py_XINCREF(0);
|
||||
Py_XDECREF(0);
|
||||
|
||||
Py_DECREF(obj);
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
Add C++ overloads for _Py_CAST_impl() to handle 0/NULL. This will allow C++
|
||||
extensions that pass 0 or NULL to macros using _Py_CAST() to continue to
|
||||
compile.
|
Loading…
Add table
Add a link
Reference in a new issue