https://github.com/python/cpython/commit/9e5e1f9988faee0a18969d4d7dda6a3e4eaf850b
commit: 9e5e1f9988faee0a18969d4d7dda6a3e4eaf850b
branch: main
author: Victor Stinner <[email protected]>
committer: vstinner <[email protected]>
date: 2026-02-12T17:03:55+01:00
summary:
gh-121617: Include <string.h> for Py_CLEAR() macro (#144666)
Python.h now also includes <string.h> in the limited C API version 3.11
and newer to fix the Py_CLEAR() macro which uses memcpy().
Add a Py_CLEAR() test in test_cext.
Modify also _Py_TYPEOF to use C23 typeof() if available.
files:
A Misc/NEWS.d/next/C_API/2026-02-10-14-49-49.gh-issue-121617.57vMqa.rst
M Doc/c-api/intro.rst
M Include/Python.h
M Include/pyport.h
M Lib/test/test_cext/extension.c
diff --git a/Doc/c-api/intro.rst b/Doc/c-api/intro.rst
index a5dfbe7f4e1305..c3a80234f86116 100644
--- a/Doc/c-api/intro.rst
+++ b/Doc/c-api/intro.rst
@@ -123,6 +123,7 @@ System includes
* ``<limits.h>``
* ``<math.h>``
* ``<stdarg.h>``
+ * ``<string.h>``
* ``<wchar.h>``
* ``<sys/types.h>`` (if present)
@@ -138,7 +139,6 @@ System includes
* ``<errno.h>``
* ``<stdio.h>``
* ``<stdlib.h>``
- * ``<string.h>``
.. note::
diff --git a/Include/Python.h b/Include/Python.h
index 78083bbf31db75..17cbc083241514 100644
--- a/Include/Python.h
+++ b/Include/Python.h
@@ -22,12 +22,13 @@
#include <limits.h> // INT_MAX
#include <math.h> // HUGE_VAL
#include <stdarg.h> // va_list
+#include <string.h> // memcpy()
#include <wchar.h> // wchar_t
#ifdef HAVE_SYS_TYPES_H
# include <sys/types.h> // ssize_t
#endif
-// <errno.h>, <stdio.h>, <stdlib.h> and <string.h> headers are no longer used
+// <errno.h>, <stdio.h> and <stdlib.h> headers are no longer used
// by Python, but kept for the backward compatibility of existing third party C
// extensions. They are not included by limited C API version 3.11 and newer.
//
@@ -37,7 +38,6 @@
# include <errno.h> // errno
# include <stdio.h> // FILE*
# include <stdlib.h> // getenv()
-# include <string.h> // memcpy()
#endif
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030d0000
# include <ctype.h> // tolower()
diff --git a/Include/pyport.h b/Include/pyport.h
index 61e2317976eed1..1e1702abd99a2c 100644
--- a/Include/pyport.h
+++ b/Include/pyport.h
@@ -567,8 +567,11 @@ extern "C" {
//
// Example: _Py_TYPEOF(x) x_copy = (x);
//
-// The macro is only defined if GCC or clang compiler is used.
-#if defined(__GNUC__) || defined(__clang__)
+// On C23, use typeof(). Otherwise, the macro is only defined
+// if GCC or clang compiler is used.
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 202311L
+# define _Py_TYPEOF(expr) typeof(expr)
+#elif defined(__GNUC__) || defined(__clang__)
# define _Py_TYPEOF(expr) __typeof__(expr)
#endif
diff --git a/Lib/test/test_cext/extension.c b/Lib/test/test_cext/extension.c
index a2f6151d8b36ed..a6b30fd627fe99 100644
--- a/Lib/test/test_cext/extension.c
+++ b/Lib/test/test_cext/extension.c
@@ -76,7 +76,7 @@ static PyMethodDef _testcext_methods[] = {
static int
_testcext_exec(PyObject *module)
{
- PyObject *result;
+ PyObject *result, *obj;
#ifdef __STDC_VERSION__
if (PyModule_AddIntMacro(module, __STDC_VERSION__) < 0) {
@@ -92,6 +92,10 @@ _testcext_exec(PyObject *module)
Py_BUILD_ASSERT(sizeof(int) == sizeof(unsigned int));
assert(Py_BUILD_ASSERT_EXPR(sizeof(int) == sizeof(unsigned int)) == 0);
+ // Test Py_CLEAR()
+ obj = NULL;
+ Py_CLEAR(obj);
+
return 0;
}
diff --git
a/Misc/NEWS.d/next/C_API/2026-02-10-14-49-49.gh-issue-121617.57vMqa.rst
b/Misc/NEWS.d/next/C_API/2026-02-10-14-49-49.gh-issue-121617.57vMqa.rst
new file mode 100644
index 00000000000000..cf84f8b1b0d36b
--- /dev/null
+++ b/Misc/NEWS.d/next/C_API/2026-02-10-14-49-49.gh-issue-121617.57vMqa.rst
@@ -0,0 +1,3 @@
+``Python.h`` now also includes ``<string.h>`` in the limited C API version 3.11
+and newer to fix the :c:macro:`Py_CLEAR` macro which uses ``memcpy()``. Patch
+by Victor Stinner.
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]