diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2022-05-17 17:45:55 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-17 17:45:55 (GMT) |
commit | 1df455042d610afac71e792ae2689060dd43178e (patch) | |
tree | d6913521bbe657c1e0a341a1801399c38b83e441 | |
parent | 38d95b5500fa2d84d718c4190ba2f1b2f6806e6c (diff) | |
download | cpython-1df455042d610afac71e792ae2689060dd43178e.zip cpython-1df455042d610afac71e792ae2689060dd43178e.tar.gz cpython-1df455042d610afac71e792ae2689060dd43178e.tar.bz2 |
gh-89653: PEP 670: Fix PyUnicode_READ() cast (GH-92872)
_Py_CAST() cannot be used with a constant type: use _Py_STATIC_CAST()
instead.
(cherry picked from commit e6fd7992a92879103215b3e9f218fe07212af9b1)
Co-authored-by: Victor Stinner <vstinner@python.org>
-rw-r--r-- | Include/cpython/unicodeobject.h | 3 | ||||
-rw-r--r-- | Lib/test/_testcppext.cpp | 31 |
2 files changed, 33 insertions, 1 deletions
diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index 8ec2fcc..84307d1 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -407,7 +407,8 @@ static inline Py_UCS4 PyUnicode_READ(int kind, } #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 #define PyUnicode_READ(kind, data, index) \ - PyUnicode_READ(_Py_STATIC_CAST(int, kind), _Py_CAST(const void*, data), \ + PyUnicode_READ(_Py_STATIC_CAST(int, kind), \ + _Py_STATIC_CAST(const void*, data), \ (index)) #endif diff --git a/Lib/test/_testcppext.cpp b/Lib/test/_testcppext.cpp index dc40f0e..f38b487 100644 --- a/Lib/test/_testcppext.cpp +++ b/Lib/test/_testcppext.cpp @@ -50,9 +50,40 @@ test_api_casts(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args)) } +static PyObject * +test_unicode(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args)) +{ + PyObject *str = PyUnicode_FromString("abc"); + if (str == nullptr) { + return nullptr; + } + + assert(PyUnicode_Check(str)); + assert(PyUnicode_GET_LENGTH(str) == 3); + + // gh-92800: test PyUnicode_READ() + const void* data = PyUnicode_DATA(str); + assert(data != nullptr); + int kind = PyUnicode_KIND(str); + assert(kind == PyUnicode_1BYTE_KIND); + assert(PyUnicode_READ(kind, data, 0) == 'a'); + + // gh-92800: test PyUnicode_READ() casts + const void* const_data = PyUnicode_DATA(str); + unsigned int ukind = static_cast<unsigned int>(kind); + assert(PyUnicode_READ(ukind, const_data, 2) == 'c'); + + assert(PyUnicode_READ_CHAR(str, 1) == 'b'); + + Py_DECREF(str); + Py_RETURN_NONE; +} + + static PyMethodDef _testcppext_methods[] = { {"add", _testcppext_add, METH_VARARGS, _testcppext_add_doc}, {"test_api_casts", test_api_casts, METH_NOARGS, nullptr}, + {"test_unicode", test_unicode, METH_NOARGS, nullptr}, {nullptr, nullptr, 0, nullptr} /* sentinel */ }; |