From 03db973823566baed31e203c07b3070f5a2e1a18 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Fri, 15 Aug 2025 17:43:55 -0400 Subject: [PATCH 01/12] tests: add linking warnings/error Signed-off-by: Henry Schreiner --- tests/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index fc08a9056f..63067a8bff 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -424,6 +424,7 @@ function(pybind11_enable_warnings target_name) -Wdeprecated -Wundef -Wnon-virtual-dtor) + target_link_options(${target_name} PRIVATE -Werror -Wodr -Wlto-type-mismatch) if(DEFINED CMAKE_CXX_STANDARD AND NOT CMAKE_CXX_STANDARD VERSION_LESS 20) target_compile_options(${target_name} PRIVATE -Wpedantic) endif() From fa26f50e8410530c9010cf9efcbeb4559e9185c9 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Fri, 15 Aug 2025 23:31:18 -0400 Subject: [PATCH 02/12] tests: check pedantic C++14 --- tests/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 63067a8bff..dd1bd8191d 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -425,7 +425,7 @@ function(pybind11_enable_warnings target_name) -Wundef -Wnon-virtual-dtor) target_link_options(${target_name} PRIVATE -Werror -Wodr -Wlto-type-mismatch) - if(DEFINED CMAKE_CXX_STANDARD AND NOT CMAKE_CXX_STANDARD VERSION_LESS 20) + if(DEFINED CMAKE_CXX_STANDARD AND NOT CMAKE_CXX_STANDARD VERSION_LESS 14) target_compile_options(${target_name} PRIVATE -Wpedantic) endif() endif() From 08cc1f434690b522ef7e351d718d91b6f417d929 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Tue, 19 Aug 2025 10:43:50 -0400 Subject: [PATCH 03/12] fix: some pedantic warnings Signed-off-by: Henry Schreiner --- tests/exo_planet_pybind11.cpp | 2 +- tests/home_planet_very_lonely_traveler.cpp | 2 +- ...st_class_sh_trampoline_shared_ptr_cpp_arg.cpp | 2 +- tests/test_class_sh_trampoline_unique_ptr.cpp | 4 ++-- tests/test_class_sh_virtual_py_cpp_mix.cpp | 4 ++-- tests/test_cross_module_rtti/bindings.cpp | 4 ++-- tests/test_potentially_slicing_weak_ptr.cpp | 4 ++-- tests/test_smart_ptr.cpp | 10 +++++----- tests/test_virtual_functions.cpp | 16 ++++++++-------- tests/test_with_catch/test_interpreter.cpp | 6 +++--- 10 files changed, 27 insertions(+), 27 deletions(-) diff --git a/tests/exo_planet_pybind11.cpp b/tests/exo_planet_pybind11.cpp index 9d1a2b84b6..011b3a92c5 100644 --- a/tests/exo_planet_pybind11.cpp +++ b/tests/exo_planet_pybind11.cpp @@ -10,7 +10,7 @@ namespace pybind11_tests { namespace test_cpp_conduit { -PYBIND11_MODULE(exo_planet_pybind11, m) { +PYBIND11_MODULE(exo_planet_pybind11, m, ) { wrap_traveler(m); m.def("wrap_very_lonely_traveler", [m]() { wrap_very_lonely_traveler(m); }); } diff --git a/tests/home_planet_very_lonely_traveler.cpp b/tests/home_planet_very_lonely_traveler.cpp index 78d50cff5d..46c7f59c9e 100644 --- a/tests/home_planet_very_lonely_traveler.cpp +++ b/tests/home_planet_very_lonely_traveler.cpp @@ -5,7 +5,7 @@ namespace pybind11_tests { namespace test_cpp_conduit { -PYBIND11_MODULE(home_planet_very_lonely_traveler, m) { +PYBIND11_MODULE(home_planet_very_lonely_traveler, m, ) { m.def("wrap_very_lonely_traveler", [m]() { wrap_very_lonely_traveler(m); }); } diff --git a/tests/test_class_sh_trampoline_shared_ptr_cpp_arg.cpp b/tests/test_class_sh_trampoline_shared_ptr_cpp_arg.cpp index 6936379c2c..b80f3b4565 100644 --- a/tests/test_class_sh_trampoline_shared_ptr_cpp_arg.cpp +++ b/tests/test_class_sh_trampoline_shared_ptr_cpp_arg.cpp @@ -30,7 +30,7 @@ std::shared_ptr pass_through_shd_ptr(const std::shared_ptr &obj) struct PySpBase : SpBase, py::trampoline_self_life_support { using SpBase::SpBase; - bool is_base_used() override { PYBIND11_OVERRIDE(bool, SpBase, is_base_used); } + bool is_base_used() override { PYBIND11_OVERRIDE(bool, SpBase, is_base_used, ); } }; struct SpBaseTester { diff --git a/tests/test_class_sh_trampoline_unique_ptr.cpp b/tests/test_class_sh_trampoline_unique_ptr.cpp index debe3324eb..0aeeaa9ef5 100644 --- a/tests/test_class_sh_trampoline_unique_ptr.cpp +++ b/tests/test_class_sh_trampoline_unique_ptr.cpp @@ -39,10 +39,10 @@ namespace class_sh_trampoline_unique_ptr { class PyClass : public Class, public py::trampoline_self_life_support { public: std::unique_ptr clone() const override { - PYBIND11_OVERRIDE_PURE(std::unique_ptr, Class, clone); + PYBIND11_OVERRIDE_PURE(std::unique_ptr, Class, clone, ); } - int foo() const override { PYBIND11_OVERRIDE_PURE(int, Class, foo); } + int foo() const override { PYBIND11_OVERRIDE_PURE(int, Class, foo, ); } }; } // namespace class_sh_trampoline_unique_ptr diff --git a/tests/test_class_sh_virtual_py_cpp_mix.cpp b/tests/test_class_sh_virtual_py_cpp_mix.cpp index df8af19e48..8b8c2b1873 100644 --- a/tests/test_class_sh_virtual_py_cpp_mix.cpp +++ b/tests/test_class_sh_virtual_py_cpp_mix.cpp @@ -32,13 +32,13 @@ int get_from_cpp_unique_ptr(std::unique_ptr b) { return b->get() + 5000; } struct BaseVirtualOverrider : Base, py::trampoline_self_life_support { using Base::Base; - int get() const override { PYBIND11_OVERRIDE(int, Base, get); } + int get() const override { PYBIND11_OVERRIDE(int, Base, get, ); } }; struct CppDerivedVirtualOverrider : CppDerived, py::trampoline_self_life_support { using CppDerived::CppDerived; - int get() const override { PYBIND11_OVERRIDE(int, CppDerived, get); } + int get() const override { PYBIND11_OVERRIDE(int, CppDerived, get, ); } }; } // namespace class_sh_virtual_py_cpp_mix diff --git a/tests/test_cross_module_rtti/bindings.cpp b/tests/test_cross_module_rtti/bindings.cpp index 94fa6874f8..d6f589b08f 100644 --- a/tests/test_cross_module_rtti/bindings.cpp +++ b/tests/test_cross_module_rtti/bindings.cpp @@ -5,10 +5,10 @@ class BaseTrampoline : public lib::Base, public pybind11::trampoline_self_life_support { public: using lib::Base::Base; - int get() const override { PYBIND11_OVERLOAD(int, lib::Base, get); } + int get() const override { PYBIND11_OVERLOAD(int, lib::Base, get, ); } }; -PYBIND11_MODULE(test_cross_module_rtti_bindings, m) { +PYBIND11_MODULE(test_cross_module_rtti_bindings, m, ) { pybind11::classh(m, "Base") .def(pybind11::init()) .def_readwrite("a", &lib::Base::a) diff --git a/tests/test_potentially_slicing_weak_ptr.cpp b/tests/test_potentially_slicing_weak_ptr.cpp index c1bf36f194..70c151207c 100644 --- a/tests/test_potentially_slicing_weak_ptr.cpp +++ b/tests/test_potentially_slicing_weak_ptr.cpp @@ -58,12 +58,12 @@ const char *determine_trampoline_state(const std::shared_ptr &sp) { struct PyVirtBaseSH : VirtBaseSH, py::trampoline_self_life_support, trampoline_is_alive_simple { using VirtBaseSH::VirtBaseSH; - int get_code() override { PYBIND11_OVERRIDE(int, VirtBaseSH, get_code); } + int get_code() override { PYBIND11_OVERRIDE(int, VirtBaseSH, get_code, ); } }; struct PyVirtBaseSP : VirtBaseSP, trampoline_is_alive_simple { // self-life-support not available using VirtBaseSP::VirtBaseSP; - int get_code() override { PYBIND11_OVERRIDE(int, VirtBaseSP, get_code); } + int get_code() override { PYBIND11_OVERRIDE(int, VirtBaseSP, get_code, ); } }; template diff --git a/tests/test_smart_ptr.cpp b/tests/test_smart_ptr.cpp index 14090895bd..edf687a7fa 100644 --- a/tests/test_smart_ptr.cpp +++ b/tests/test_smart_ptr.cpp @@ -372,11 +372,11 @@ PYBIND11_DECLARE_HOLDER_TYPE(T, ref, true) PYBIND11_DECLARE_HOLDER_TYPE(T, const_only_shared_ptr, true) PYBIND11_DECLARE_HOLDER_TYPE(T, shared_ptr_as_custom_holder) // The following is not required anymore for std::shared_ptr, but it should compile without error: -PYBIND11_DECLARE_HOLDER_TYPE(T, std::shared_ptr) -PYBIND11_DECLARE_HOLDER_TYPE(T, huge_unique_ptr) -PYBIND11_DECLARE_HOLDER_TYPE(T, custom_unique_ptr) -PYBIND11_DECLARE_HOLDER_TYPE(T, shared_ptr_with_addressof_operator) -PYBIND11_DECLARE_HOLDER_TYPE(T, unique_ptr_with_addressof_operator) +PYBIND11_DECLARE_HOLDER_TYPE(T, std::shared_ptr, ) +PYBIND11_DECLARE_HOLDER_TYPE(T, huge_unique_ptr, ) +PYBIND11_DECLARE_HOLDER_TYPE(T, custom_unique_ptr, ) +PYBIND11_DECLARE_HOLDER_TYPE(T, shared_ptr_with_addressof_operator, ) +PYBIND11_DECLARE_HOLDER_TYPE(T, unique_ptr_with_addressof_operator, ) namespace holder_caster_traits_test { struct example_base {}; diff --git a/tests/test_virtual_functions.cpp b/tests/test_virtual_functions.cpp index 78a4fdfa50..3a9a1f1564 100644 --- a/tests/test_virtual_functions.cpp +++ b/tests/test_virtual_functions.cpp @@ -219,7 +219,7 @@ class test_override_cache_helper { }; class test_override_cache_helper_trampoline : public test_override_cache_helper { - int func() override { PYBIND11_OVERRIDE(int, test_override_cache_helper, func); } + int func() override { PYBIND11_OVERRIDE(int, test_override_cache_helper, func, ); } }; inline int test_override_cache(std::shared_ptr const &instance) { @@ -279,7 +279,7 @@ TEST_SUBMODULE(virtual_functions, m) { py::print("PyA.f()"); // This convolution just gives a `void`, but tests that PYBIND11_TYPE() works to // protect a type containing a , - PYBIND11_OVERRIDE(PYBIND11_TYPE(typename std::enable_if::type), A, f); + PYBIND11_OVERRIDE(PYBIND11_TYPE(typename std::enable_if::type), A, f, ); } }; @@ -302,7 +302,7 @@ TEST_SUBMODULE(virtual_functions, m) { ~PyA2() override { py::print("PyA2.~PyA2()"); } void f() override { py::print("PyA2.f()"); - PYBIND11_OVERRIDE(void, A2, f); + PYBIND11_OVERRIDE(void, A2, f, ); } }; @@ -370,26 +370,26 @@ TEST_SUBMODULE(virtual_functions, m) { public: using OverrideTest::OverrideTest; std::string str_value() override { - PYBIND11_OVERRIDE(std::string, OverrideTest, str_value); + PYBIND11_OVERRIDE(std::string, OverrideTest, str_value, ); } // Not allowed (enabling the below should hit a static_assert failure): we can't get a // reference to a python numeric value, since we only copy values in the numeric type // caster: #ifdef PYBIND11_NEVER_DEFINED_EVER std::string &str_ref() override { - PYBIND11_OVERRIDE(std::string &, OverrideTest, str_ref); + PYBIND11_OVERRIDE(std::string &, OverrideTest, str_ref, ); } #endif // But we can work around it like this: private: std::string _tmp; - std::string str_ref_helper() { PYBIND11_OVERRIDE(std::string, OverrideTest, str_ref); } + std::string str_ref_helper() { PYBIND11_OVERRIDE(std::string, OverrideTest, str_ref, ); } public: std::string &str_ref() override { return _tmp = str_ref_helper(); } - A A_value() override { PYBIND11_OVERRIDE(A, OverrideTest, A_value); } - A &A_ref() override { PYBIND11_OVERRIDE(A &, OverrideTest, A_ref); } + A A_value() override { PYBIND11_OVERRIDE(A, OverrideTest, A_value, ); } + A &A_ref() override { PYBIND11_OVERRIDE(A &, OverrideTest, A_ref, ); } }; py::class_(m, "OverrideTest_A") diff --git a/tests/test_with_catch/test_interpreter.cpp b/tests/test_with_catch/test_interpreter.cpp index 4103c0f5ff..b83618c2d3 100644 --- a/tests/test_with_catch/test_interpreter.cpp +++ b/tests/test_with_catch/test_interpreter.cpp @@ -47,8 +47,8 @@ class Widget { class PyWidget final : public Widget { using Widget::Widget; - int the_answer() const override { PYBIND11_OVERRIDE_PURE(int, Widget, the_answer); } - std::string argv0() const override { PYBIND11_OVERRIDE_PURE(std::string, Widget, argv0); } + int the_answer() const override { PYBIND11_OVERRIDE_PURE(int, Widget, the_answer, ); } + std::string argv0() const override { PYBIND11_OVERRIDE_PURE(std::string, Widget, argv0, ); } }; class test_override_cache_helper { @@ -64,7 +64,7 @@ class test_override_cache_helper { }; class test_override_cache_helper_trampoline : public test_override_cache_helper { - int func() override { PYBIND11_OVERRIDE(int, test_override_cache_helper, func); } + int func() override { PYBIND11_OVERRIDE(int, test_override_cache_helper, func, ); } }; PYBIND11_EMBEDDED_MODULE(widget_module, m, py::multiple_interpreters::per_interpreter_gil()) { From 6232476d2f75a065261bc4046951b21d1fdc9b85 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Wed, 20 Aug 2025 00:46:42 -0400 Subject: [PATCH 04/12] feat: add py::mod_gil_used() Signed-off-by: Henry Schreiner --- include/pybind11/pybind11.h | 2 ++ tests/exo_planet_pybind11.cpp | 2 +- tests/extra_setuptools/test_setuphelper.py | 2 +- tests/home_planet_very_lonely_traveler.cpp | 2 +- tests/test_cross_module_rtti/bindings.cpp | 2 +- 5 files changed, 6 insertions(+), 4 deletions(-) diff --git a/include/pybind11/pybind11.h b/include/pybind11/pybind11.h index ccd7baee02..ead391d19f 100644 --- a/include/pybind11/pybind11.h +++ b/include/pybind11/pybind11.h @@ -1468,6 +1468,8 @@ class mod_gil_not_used { bool flag_; }; +inline mod_gil_not_used mod_gil_used() { return mod_gil_not_used(false); } + class multiple_interpreters { public: enum class level { diff --git a/tests/exo_planet_pybind11.cpp b/tests/exo_planet_pybind11.cpp index 011b3a92c5..1641b19f2e 100644 --- a/tests/exo_planet_pybind11.cpp +++ b/tests/exo_planet_pybind11.cpp @@ -10,7 +10,7 @@ namespace pybind11_tests { namespace test_cpp_conduit { -PYBIND11_MODULE(exo_planet_pybind11, m, ) { +PYBIND11_MODULE(exo_planet_pybind11, m, pybind11::mod_gil_used()) { wrap_traveler(m); m.def("wrap_very_lonely_traveler", [m]() { wrap_very_lonely_traveler(m); }); } diff --git a/tests/extra_setuptools/test_setuphelper.py b/tests/extra_setuptools/test_setuphelper.py index 2c069adffb..22c0c76f5d 100644 --- a/tests/extra_setuptools/test_setuphelper.py +++ b/tests/extra_setuptools/test_setuphelper.py @@ -65,7 +65,7 @@ def test_simple_setup_py(monkeypatch, tmpdir, parallel, std): int f(int x) { return x * 3; } - PYBIND11_MODULE(simple_setup, m) { + PYBIND11_MODULE(simple_setup, m, pybind11::mod_gil_used()) { m.def("f", &f); } """ diff --git a/tests/home_planet_very_lonely_traveler.cpp b/tests/home_planet_very_lonely_traveler.cpp index 46c7f59c9e..2a9fc4490a 100644 --- a/tests/home_planet_very_lonely_traveler.cpp +++ b/tests/home_planet_very_lonely_traveler.cpp @@ -5,7 +5,7 @@ namespace pybind11_tests { namespace test_cpp_conduit { -PYBIND11_MODULE(home_planet_very_lonely_traveler, m, ) { +PYBIND11_MODULE(home_planet_very_lonely_traveler, m, py::mod_gil_used()) { m.def("wrap_very_lonely_traveler", [m]() { wrap_very_lonely_traveler(m); }); } diff --git a/tests/test_cross_module_rtti/bindings.cpp b/tests/test_cross_module_rtti/bindings.cpp index d6f589b08f..4bd7d37a4f 100644 --- a/tests/test_cross_module_rtti/bindings.cpp +++ b/tests/test_cross_module_rtti/bindings.cpp @@ -8,7 +8,7 @@ class BaseTrampoline : public lib::Base, public pybind11::trampoline_self_life_s int get() const override { PYBIND11_OVERLOAD(int, lib::Base, get, ); } }; -PYBIND11_MODULE(test_cross_module_rtti_bindings, m, ) { +PYBIND11_MODULE(test_cross_module_rtti_bindings, m, pybind11::mod_gil_used()) { pybind11::classh(m, "Base") .def(pybind11::init()) .def_readwrite("a", &lib::Base::a) From a265cccf0881b07b96e0ebeaf2b95ca02364e0b9 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Wed, 20 Aug 2025 01:31:39 -0400 Subject: [PATCH 05/12] fix: use not_supported() Signed-off-by: Henry Schreiner --- tests/test_cmake_build/embed.cpp | 4 +++- tests/test_with_catch/test_interpreter.cpp | 9 ++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/tests/test_cmake_build/embed.cpp b/tests/test_cmake_build/embed.cpp index 30bc4f1e14..45f263a111 100644 --- a/tests/test_cmake_build/embed.cpp +++ b/tests/test_cmake_build/embed.cpp @@ -1,7 +1,9 @@ +#include #include + namespace py = pybind11; -PYBIND11_EMBEDDED_MODULE(test_cmake_build, m) { +PYBIND11_EMBEDDED_MODULE(test_cmake_build, m, py::multiple_interpreters::not_supported()) { m.def("add", [](int i, int j) { return i + j; }); } diff --git a/tests/test_with_catch/test_interpreter.cpp b/tests/test_with_catch/test_interpreter.cpp index b83618c2d3..bd4f22de72 100644 --- a/tests/test_with_catch/test_interpreter.cpp +++ b/tests/test_with_catch/test_interpreter.cpp @@ -1,5 +1,6 @@ #include #include +#include // Silence MSVC C++17 deprecation warning from Catch regarding std::uncaught_exceptions (up to // catch 2.0.1; this should be fixed in the next catch release after 2.0.1). @@ -78,7 +79,7 @@ PYBIND11_EMBEDDED_MODULE(widget_module, m, py::multiple_interpreters::per_interp sub.def("add", [](int i, int j) { return i + j; }); } -PYBIND11_EMBEDDED_MODULE(trampoline_module, m) { +PYBIND11_EMBEDDED_MODULE(trampoline_module, m, py::multiple_interpreters::not_supported()) { py::class_>(m, "test_override_cache_helper") @@ -94,9 +95,11 @@ PYBIND11_EMBEDDED_MODULE(enum_module, m, py::multiple_interpreters::per_interpre .value("value2", SomeEnum::value2); } -PYBIND11_EMBEDDED_MODULE(throw_exception, ) { throw std::runtime_error("C++ Error"); } +PYBIND11_EMBEDDED_MODULE(throw_exception, , py::multiple_interpreters::not_supported()) { + throw std::runtime_error("C++ Error"); +} -PYBIND11_EMBEDDED_MODULE(throw_error_already_set, ) { +PYBIND11_EMBEDDED_MODULE(throw_error_already_set, , py::multiple_interpreters::not_supported()) { auto d = py::dict(); d["missing"].cast(); } From c7e8cf2f3d9c5bf1fde654059c00704b291d81ce Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 05:32:17 +0000 Subject: [PATCH 06/12] style: pre-commit fixes --- tests/test_cmake_build/embed.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_cmake_build/embed.cpp b/tests/test_cmake_build/embed.cpp index 45f263a111..dabe03af0e 100644 --- a/tests/test_cmake_build/embed.cpp +++ b/tests/test_cmake_build/embed.cpp @@ -1,5 +1,5 @@ -#include #include +#include namespace py = pybind11; From bffaf1446b9bb4a1e863167cbb6cc7e18f9931e9 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Thu, 21 Aug 2025 11:17:18 -0400 Subject: [PATCH 07/12] Update CMakeLists.txt --- tests/CMakeLists.txt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index dd1bd8191d..41e8579c75 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -419,15 +419,13 @@ function(pybind11_enable_warnings target_name) ${target_name} PRIVATE -Wall -Wextra + -Wpedantic -Wconversion -Wcast-qual -Wdeprecated -Wundef -Wnon-virtual-dtor) target_link_options(${target_name} PRIVATE -Werror -Wodr -Wlto-type-mismatch) - if(DEFINED CMAKE_CXX_STANDARD AND NOT CMAKE_CXX_STANDARD VERSION_LESS 14) - target_compile_options(${target_name} PRIVATE -Wpedantic) - endif() endif() if(PYBIND11_WERROR) From b2497c37c09302ac008d58301998754a47cd9908 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Thu, 21 Aug 2025 16:06:11 -0400 Subject: [PATCH 08/12] fix: remove the true/false parameter from mod_gil_not_used Signed-off-by: Henry Schreiner --- include/pybind11/pybind11.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/include/pybind11/pybind11.h b/include/pybind11/pybind11.h index ead391d19f..0bd2364e12 100644 --- a/include/pybind11/pybind11.h +++ b/include/pybind11/pybind11.h @@ -1461,11 +1461,14 @@ PYBIND11_NAMESPACE_END(detail) // Use to activate Py_MOD_GIL_NOT_USED. class mod_gil_not_used { public: - explicit mod_gil_not_used(bool flag = true) : flag_(flag) {} + mod_gil_not_used() : flag_(true) {} bool flag() const { return flag_; } + friend mod_gil_not_used mod_gil_used(); + private: bool flag_; + explicit mod_gil_not_used(bool flag) : flag_(flag) {} }; inline mod_gil_not_used mod_gil_used() { return mod_gil_not_used(false); } @@ -1738,7 +1741,7 @@ class module_ : public object { const char *doc, PyModuleDef *def, mod_gil_not_used gil_not_used - = mod_gil_not_used(false)) { + = mod_gil_used()) { // Placement new (not an allocation). new (def) PyModuleDef{/* m_base */ PyModuleDef_HEAD_INIT, /* m_name */ name, From f0f3aea80cd09812986b6a7561872e92f10c0389 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 21 Aug 2025 20:22:17 +0000 Subject: [PATCH 09/12] style: pre-commit fixes --- include/pybind11/pybind11.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/include/pybind11/pybind11.h b/include/pybind11/pybind11.h index 0bd2364e12..0546974e3f 100644 --- a/include/pybind11/pybind11.h +++ b/include/pybind11/pybind11.h @@ -1740,8 +1740,7 @@ class module_ : public object { static module_ create_extension_module(const char *name, const char *doc, PyModuleDef *def, - mod_gil_not_used gil_not_used - = mod_gil_used()) { + mod_gil_not_used gil_not_used = mod_gil_used()) { // Placement new (not an allocation). new (def) PyModuleDef{/* m_base */ PyModuleDef_HEAD_INIT, /* m_name */ name, From 317271836f94e963892cf88404f2fb378cd95941 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Thu, 21 Aug 2025 18:29:26 -0400 Subject: [PATCH 10/12] Update tests/CMakeLists.txt --- tests/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 41e8579c75..d6415b98bc 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -425,7 +425,6 @@ function(pybind11_enable_warnings target_name) -Wdeprecated -Wundef -Wnon-virtual-dtor) - target_link_options(${target_name} PRIVATE -Werror -Wodr -Wlto-type-mismatch) endif() if(PYBIND11_WERROR) From 40d5ea6720d84cc5276dc593a95620f6ea89c0d4 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Mon, 27 Jul 2026 09:59:30 -0400 Subject: [PATCH 11/12] fix: deprecate mod_gil_not_used(bool) instead of removing it Keep the bool constructor public and mark it deprecated, so existing code that spells mod_gil_not_used(false) still compiles. mod_gil_used() now sets the flag through its friendship, which keeps the deprecated constructor the only bool overload and stops pybind11 warning against itself. Also use the py:: alias in exo_planet_pybind11.cpp to match its sibling home_planet_very_lonely_traveler.cpp. Assisted-by: ClaudeCode:claude-opus-5 --- include/pybind11/pybind11.h | 10 ++++++++-- tests/exo_planet_pybind11.cpp | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/include/pybind11/pybind11.h b/include/pybind11/pybind11.h index 0546974e3f..e41076df1a 100644 --- a/include/pybind11/pybind11.h +++ b/include/pybind11/pybind11.h @@ -1462,16 +1462,22 @@ PYBIND11_NAMESPACE_END(detail) class mod_gil_not_used { public: mod_gil_not_used() : flag_(true) {} + PYBIND11_DEPRECATED("use py::mod_gil_not_used() or py::mod_gil_used() instead") + explicit mod_gil_not_used(bool flag) : flag_(flag) {} bool flag() const { return flag_; } friend mod_gil_not_used mod_gil_used(); private: bool flag_; - explicit mod_gil_not_used(bool flag) : flag_(flag) {} }; -inline mod_gil_not_used mod_gil_used() { return mod_gil_not_used(false); } +// Use to activate Py_MOD_GIL_USED, the current default. +inline mod_gil_not_used mod_gil_used() { + mod_gil_not_used tag; + tag.flag_ = false; + return tag; +} class multiple_interpreters { public: diff --git a/tests/exo_planet_pybind11.cpp b/tests/exo_planet_pybind11.cpp index 1641b19f2e..cff21f0e4c 100644 --- a/tests/exo_planet_pybind11.cpp +++ b/tests/exo_planet_pybind11.cpp @@ -10,7 +10,7 @@ namespace pybind11_tests { namespace test_cpp_conduit { -PYBIND11_MODULE(exo_planet_pybind11, m, pybind11::mod_gil_used()) { +PYBIND11_MODULE(exo_planet_pybind11, m, py::mod_gil_used()) { wrap_traveler(m); m.def("wrap_very_lonely_traveler", [m]() { wrap_very_lonely_traveler(m); }); } From 1d68626ea9dce5f23cabac6dc9865241c0dbdb2b Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Mon, 27 Jul 2026 10:55:44 -0400 Subject: [PATCH 12/12] fix: add trailing comma to macros picked up in rebase test_smart_ptr.cpp and standalone_enum_module.cpp came from master after this branch was written, so they still invoked variadic macros with no variadic argument. That is a pedantic error below C++20. Assisted-by: ClaudeCode:claude-opus-5 --- tests/standalone_enum_module.cpp | 2 +- tests/test_smart_ptr.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/standalone_enum_module.cpp b/tests/standalone_enum_module.cpp index 7e917b974e..a6269860f0 100644 --- a/tests/standalone_enum_module.cpp +++ b/tests/standalone_enum_module.cpp @@ -8,6 +8,6 @@ enum SomeEnum {}; using namespace standalone_enum_module_ns; -PYBIND11_MODULE(standalone_enum_module, m) { // Added in PR #6015 +PYBIND11_MODULE(standalone_enum_module, m, pybind11::mod_gil_used()) { // Added in PR #6015 pybind11::enum_ some_enum_wrapper(m, "SomeEnum"); } diff --git a/tests/test_smart_ptr.cpp b/tests/test_smart_ptr.cpp index edf687a7fa..10f6843202 100644 --- a/tests/test_smart_ptr.cpp +++ b/tests/test_smart_ptr.cpp @@ -370,7 +370,7 @@ struct holder_helper> { // Make pybind aware of the ref-counted wrapper type (s): PYBIND11_DECLARE_HOLDER_TYPE(T, ref, true) PYBIND11_DECLARE_HOLDER_TYPE(T, const_only_shared_ptr, true) -PYBIND11_DECLARE_HOLDER_TYPE(T, shared_ptr_as_custom_holder) +PYBIND11_DECLARE_HOLDER_TYPE(T, shared_ptr_as_custom_holder, ) // The following is not required anymore for std::shared_ptr, but it should compile without error: PYBIND11_DECLARE_HOLDER_TYPE(T, std::shared_ptr, ) PYBIND11_DECLARE_HOLDER_TYPE(T, huge_unique_ptr, )