]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-129666: Add C11/C++11 to docs and -pedantic-errors to GCC/clang test_c[pp]ext...
authorPetr Viktorin <encukou@gmail.com>
Tue, 4 Mar 2025 13:10:09 +0000 (14:10 +0100)
committerGitHub <noreply@github.com>
Tue, 4 Mar 2025 13:10:09 +0000 (14:10 +0100)
Disable pedantic check for c++03 (unlimited API)

Also add a check for c++03 *limited* API, which passes in pedantic mode
after removing a comma in the `PySendResult` declaration, and allowing
`long long`.

Doc/c-api/intro.rst
Include/object.h
Lib/test/test_cext/__init__.py
Lib/test/test_cext/extension.c
Lib/test/test_cext/setup.py
Lib/test/test_cppext/__init__.py
Lib/test/test_cppext/extension.cpp
Lib/test/test_cppext/setup.py

index 8ef463e3f88ca8fb4a3cd13977d20ad744d49bec..76d7d5793428f8db173b8ce4d8370d159197efe8 100644 (file)
@@ -30,6 +30,16 @@ familiar with writing an extension before  attempting to embed Python in a real
 application.
 
 
+Language version compatibility
+==============================
+
+Python's C API is compatible with C11 and C++11 versions of C and C++.
+
+This is a lower limit: the C API does not require features from later
+C/C++ versions.
+You do *not* need to enable your compiler's "c11 mode".
+
+
 Coding standards
 ================
 
index da7b3668c033f48b73989bf98df02003451e2c85..7d1667d889cb43f5f3d84650d50177989475ed7b 100644 (file)
@@ -683,7 +683,7 @@ PyAPI_DATA(PyObject) _Py_NotImplementedStruct; /* Don't use this directly */
 typedef enum {
     PYGEN_RETURN = 0,
     PYGEN_ERROR = -1,
-    PYGEN_NEXT = 1,
+    PYGEN_NEXT = 1
 } PySendResult;
 #endif
 
index 54859f9ff7622d13986d3cd86ede568a2b55b3fe..402a2d04fa875e10f4cb5f94e5ac8d2dbe66647c 100644 (file)
@@ -38,6 +38,9 @@ class TestExt(unittest.TestCase):
 
     @unittest.skipIf(support.MS_WINDOWS, "MSVC doesn't support /std:c99")
     def test_build_c99(self):
+        # In public docs, we say C API is compatible with C11. However,
+        # in practice we do maintain C99 compatibility in public headers.
+        # Please ask the C API WG before adding a new C11-only feature.
         self.check_build('_test_c99_cext', std='c99')
 
     @support.requires_gil_enabled('incompatible with Free Threading')
index b76abe1d74c628584a827f1a1c113b6527d7b773..64629c5a6da8cd26d2208170ac1befd87920464a 100644 (file)
@@ -58,11 +58,24 @@ _testcext_exec(
     return 0;
 }
 
+// Converting from function pointer to void* has undefined behavior, but
+// works on all known platforms, and CPython's module and type slots currently
+// need it.
+// (GCC doesn't have a narrower category for this than -Wpedantic.)
+_Py_COMP_DIAG_PUSH
+#if defined(__GNUC__)
+#pragma GCC diagnostic ignored "-Wpedantic"
+#elif defined(__clang__)
+#pragma clang diagnostic ignored "-Wpedantic"
+#endif
+
 static PyModuleDef_Slot _testcext_slots[] = {
     {Py_mod_exec, (void*)_testcext_exec},
     {0, NULL}
 };
 
+_Py_COMP_DIAG_POP
+
 
 PyDoc_STRVAR(_testcext_doc, "C test extension.");
 
index e97749b45ea6f31d20ec3eec10a112b61eb99d04..1275282983f7ffd700f7cbbf423f9e172eb81f5d 100644 (file)
@@ -21,6 +21,9 @@ if not support.MS_WINDOWS:
 
         # gh-120593: Check the 'const' qualifier
         '-Wcast-qual',
+
+        # Ask for strict(er) compliance with the standard
+        '-pedantic-errors',
     ]
     if not support.Py_GIL_DISABLED:
         CFLAGS.append(
index d5195227308fecd90f384205971bb4b3339d7149..13f9ea1c56cca57b49a4b52f8cf2305d12ba3e45 100644 (file)
@@ -29,8 +29,15 @@ class TestCPPExt(unittest.TestCase):
         self.check_build('_testcppext')
 
     def test_build_cpp03(self):
+        # In public docs, we say C API is compatible with C++11. However,
+        # in practice we do maintain C++03 compatibility in public headers.
+        # Please ask the C API WG before adding a new C++11-only feature.
         self.check_build('_testcpp03ext', std='c++03')
 
+    @support.requires_gil_enabled('incompatible with Free Threading')
+    def test_build_limited_cpp03(self):
+        self.check_build('_test_limited_cpp03ext', std='c++03', limited=True)
+
     @unittest.skipIf(support.MS_WINDOWS, "MSVC doesn't support /std:c++11")
     def test_build_cpp11(self):
         self.check_build('_testcpp11ext', std='c++11')
index 500d5918145c00ab00dfca4d965fbb8f7b060d39..5b3571b295bec3bf897938975d479cf8c3092be3 100644 (file)
@@ -161,11 +161,24 @@ private:
 
 int VirtualPyObject::instance_count = 0;
 
+// Converting from function pointer to void* has undefined behavior, but
+// works on all known platforms, and CPython's module and type slots currently
+// need it.
+// (GCC doesn't have a narrower category for this than -Wpedantic.)
+_Py_COMP_DIAG_PUSH
+#if defined(__GNUC__)
+#pragma GCC diagnostic ignored "-Wpedantic"
+#elif defined(__clang__)
+#pragma clang diagnostic ignored "-Wpedantic"
+#endif
+
 PyType_Slot VirtualPyObject_Slots[] = {
     {Py_tp_free, (void*)VirtualPyObject::dealloc},
     {0, _Py_NULL},
 };
 
+_Py_COMP_DIAG_POP
+
 PyType_Spec VirtualPyObject_Spec = {
     /* .name */ STR(MODULE_NAME) ".VirtualPyObject",
     /* .basicsize */ sizeof(VirtualPyObject),
@@ -241,11 +254,20 @@ _testcppext_exec(PyObject *module)
     return 0;
 }
 
+// Need to ignore "-Wpedantic" warnings; see VirtualPyObject_Slots above
+_Py_COMP_DIAG_PUSH
+#if defined(__GNUC__)
+#pragma GCC diagnostic ignored "-Wpedantic"
+#elif defined(__clang__)
+#pragma clang diagnostic ignored "-Wpedantic"
+#endif
+
 static PyModuleDef_Slot _testcppext_slots[] = {
     {Py_mod_exec, reinterpret_cast<void*>(_testcppext_exec)},
     {0, _Py_NULL}
 };
 
+_Py_COMP_DIAG_POP
 
 PyDoc_STRVAR(_testcppext_doc, "C++ test extension.");
 
index 019ff18446a2ebc4036afbad89899ef3ee904744..b30c9e2746c980ccab45e4c4365142481f91f1bf 100644 (file)
@@ -19,6 +19,17 @@ if not support.MS_WINDOWS:
         # warnings
         '-Werror',
     ]
+
+    CPPFLAGS_PEDANTIC = [
+        # Ask for strict(er) compliance with the standard.
+        # We cannot do this for c++03 unlimited API, since several headers in
+        # Include/cpython/ use commas at end of `enum` declarations, a C++11
+        # feature for which GCC has no narrower option than -Wpedantic itself.
+        '-pedantic-errors',
+
+        # We also use `long long`, a C++11 feature we can enable individually.
+        '-Wno-long-long',
+    ]
 else:
     # MSVC compiler flags
     CPPFLAGS = [
@@ -27,6 +38,7 @@ else:
         # Treat all compiler warnings as compiler errors
         '/WX',
     ]
+    CPPFLAGS_PEDANTIC = []
 
 
 def main():
@@ -45,6 +57,10 @@ def main():
         else:
             cppflags.append(f'-std={std}')
 
+        if limited or (std != 'c++03'):
+            # See CPPFLAGS_PEDANTIC docstring
+            cppflags.extend(CPPFLAGS_PEDANTIC)
+
     # gh-105776: When "gcc -std=11" is used as the C++ compiler, -std=c11
     # option emits a C++ compiler warning. Remove "-std11" option from the
     # CC command.