]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-91321: Add _Py_NULL macro (#92253)
authorVictor Stinner <vstinner@python.org>
Tue, 3 May 2022 19:38:37 +0000 (21:38 +0200)
committerGitHub <noreply@github.com>
Tue, 3 May 2022 19:38:37 +0000 (21:38 +0200)
Fix C++ compiler warnings: "zero as null pointer constant"
(clang -Wzero-as-null-pointer-constant).

* Add the _Py_NULL macro used by static inline functions to use
  nullptr in C++.
* Replace NULL with nullptr in _testcppext.cpp.

Include/cpython/abstract.h
Include/cpython/unicodeobject.h
Include/object.h
Include/pyport.h
Lib/test/_testcppext.cpp
Lib/test/test_cppext.py

index 77e2cfa02ed074017613b75f844a4a5e376fcf6b..161e2cb30fde3ef3782a11abe9ebef83e3314c30 100644 (file)
@@ -103,8 +103,8 @@ PyAPI_FUNC(PyObject *) PyObject_VectorcallMethod(
 static inline PyObject *
 PyObject_CallMethodNoArgs(PyObject *self, PyObject *name)
 {
-    return PyObject_VectorcallMethod(name, &self,
-           1 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
+    size_t nargsf = 1 | PY_VECTORCALL_ARGUMENTS_OFFSET;
+    return PyObject_VectorcallMethod(name, &self, nargsf, _Py_NULL);
 }
 
 static inline PyObject *
@@ -113,8 +113,8 @@ PyObject_CallMethodOneArg(PyObject *self, PyObject *name, PyObject *arg)
     PyObject *args[2] = {self, arg};
 
     assert(arg != NULL);
-    return PyObject_VectorcallMethod(name, args,
-           2 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
+    size_t nargsf = 2 | PY_VECTORCALL_ARGUMENTS_OFFSET;
+    return PyObject_VectorcallMethod(name, args, nargsf, _Py_NULL);
 }
 
 PyAPI_FUNC(PyObject *) _PyObject_CallMethod(PyObject *obj,
@@ -144,7 +144,7 @@ _PyObject_VectorcallMethodId(
 {
     PyObject *oname = _PyUnicode_FromId(name); /* borrowed */
     if (!oname) {
-        return NULL;
+        return _Py_NULL;
     }
     return PyObject_VectorcallMethod(oname, args, nargsf, kwnames);
 }
@@ -152,8 +152,8 @@ _PyObject_VectorcallMethodId(
 static inline PyObject *
 _PyObject_CallMethodIdNoArgs(PyObject *self, _Py_Identifier *name)
 {
-    return _PyObject_VectorcallMethodId(name, &self,
-           1 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
+    size_t nargsf = 1 | PY_VECTORCALL_ARGUMENTS_OFFSET;
+    return _PyObject_VectorcallMethodId(name, &self, nargsf, _Py_NULL);
 }
 
 static inline PyObject *
@@ -162,8 +162,8 @@ _PyObject_CallMethodIdOneArg(PyObject *self, _Py_Identifier *name, PyObject *arg
     PyObject *args[2] = {self, arg};
 
     assert(arg != NULL);
-    return _PyObject_VectorcallMethodId(name, args,
-           2 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
+    size_t nargsf = 2 | PY_VECTORCALL_ARGUMENTS_OFFSET;
+    return _PyObject_VectorcallMethodId(name, args, nargsf, _Py_NULL);
 }
 
 PyAPI_FUNC(int) _PyObject_HasLen(PyObject *o);
index 96bfaaf4d2badde291c0eed46cbb97cf0497faf0..8e182d0fbf799950f605ca7d11b09c59bb58feed 100644 (file)
@@ -642,9 +642,9 @@ static inline Py_ssize_t PyUnicode_GET_SIZE(PyObject *op)
 {
     _Py_COMP_DIAG_PUSH
     _Py_COMP_DIAG_IGNORE_DEPR_DECLS
-    if (_PyASCIIObject_CAST(op)->wstr == NULL) {
+    if (_PyASCIIObject_CAST(op)->wstr == _Py_NULL) {
         (void)PyUnicode_AsUnicode(op);
-        assert(_PyASCIIObject_CAST(op)->wstr != NULL);
+        assert(_PyASCIIObject_CAST(op)->wstr != _Py_NULL);
     }
     return PyUnicode_WSTR_LENGTH(op);
     _Py_COMP_DIAG_POP
@@ -674,7 +674,7 @@ Py_DEPRECATED(3.3)
 static inline Py_UNICODE* PyUnicode_AS_UNICODE(PyObject *op)
 {
     wchar_t *wstr = _PyASCIIObject_CAST(op)->wstr;
-    if (wstr != NULL) {
+    if (wstr != _Py_NULL) {
         return wstr;
     }
 
index f93ecce13b4099c33ef3341237abe6ab170119ba..a0dba697569c43daba4053ca83f5d13e6f1d591b 100644 (file)
@@ -587,7 +587,7 @@ static inline void Py_DECREF(PyObject *op)
 /* Function to use in case the object pointer can be NULL: */
 static inline void Py_XINCREF(PyObject *op)
 {
-    if (op != NULL) {
+    if (op != _Py_NULL) {
         Py_INCREF(op);
     }
 }
@@ -597,7 +597,7 @@ static inline void Py_XINCREF(PyObject *op)
 
 static inline void Py_XDECREF(PyObject *op)
 {
-    if (op != NULL) {
+    if (op != _Py_NULL) {
         Py_DECREF(op);
     }
 }
index f6270be0ce5c0e10fa30eed30c7359d16158e20e..614a2789fb0781ec94b59e9c3e4589438823cdf8 100644 (file)
 #  define _Py_CAST(type, expr) ((type)(expr))
 #endif
 
+// Static inline functions should use _Py_NULL rather than using directly NULL
+// to prevent C++ compiler warnings. In C++, _Py_NULL uses nullptr.
+#ifdef __cplusplus
+#  define _Py_NULL nullptr
+#else
+#  define _Py_NULL NULL
+#endif
+
 
 /* Defines to build Python and its standard library:
  *
index 257843bfc7726d242300c1040b1919ba94f05007..dc40f0ee9eb1cb953aabdfabb8449cf0ffc7f825 100644 (file)
@@ -52,7 +52,7 @@ test_api_casts(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args))
 
 static PyMethodDef _testcppext_methods[] = {
     {"add", _testcppext_add, METH_VARARGS, _testcppext_add_doc},
-    {"test_api_casts", test_api_casts, METH_NOARGS, NULL},
+    {"test_api_casts", test_api_casts, METH_NOARGS, nullptr},
     {nullptr, nullptr, 0, nullptr}  /* sentinel */
 };
 
@@ -68,7 +68,7 @@ _testcppext_exec(PyObject *module)
 
 static PyModuleDef_Slot _testcppext_slots[] = {
     {Py_mod_exec, reinterpret_cast<void*>(_testcppext_exec)},
-    {0, NULL}
+    {0, nullptr}
 };
 
 
@@ -81,8 +81,8 @@ static struct PyModuleDef _testcppext_module = {
     0,  // m_size
     _testcppext_methods,  // m_methods
     _testcppext_slots,  // m_slots
-    NULL,  // m_traverse
-    NULL,  // m_clear
+    nullptr,  // m_traverse
+    nullptr,  // m_clear
     nullptr,  // m_free
 };
 
index fbb79bb8ac3ed1babc3656da0cb9f51dd5232200..e056410456630e1ca211d172ccae5004cfd3a717 100644 (file)
@@ -29,6 +29,8 @@ if not MS_WINDOWS:
         '-Werror',
         # Warn on old-style cast (C cast) like: (PyObject*)op
         '-Wold-style-cast',
+        # Warn when using NULL rather than _Py_NULL in static inline functions
+        '-Wzero-as-null-pointer-constant',
     ]
 else:
     # Don't pass any compiler flag to MSVC