From ed7fece77feba95abd34d2daa4b862586692603c Mon Sep 17 00:00:00 2001 From: Xiaofei Wang <6218006+wangxf123456@users.noreply.github.com> Date: Wed, 2 Aug 2023 17:37:31 -0700 Subject: [PATCH 1/5] Also accept automatic_reference --- include/pybind11/detail/smart_holder_type_casters.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/pybind11/detail/smart_holder_type_casters.h b/include/pybind11/detail/smart_holder_type_casters.h index 67d7c4f13c..bd9483a025 100644 --- a/include/pybind11/detail/smart_holder_type_casters.h +++ b/include/pybind11/detail/smart_holder_type_casters.h @@ -965,6 +965,7 @@ struct smart_holder_type_caster> : smart_holder_type_caste static handle cast(std::unique_ptr &&src, return_value_policy policy, handle parent) { if (policy != return_value_policy::automatic + && policy != return_value_policy::automatic_reference && policy != return_value_policy::reference_internal && policy != return_value_policy::move && policy != return_value_policy::_clif_automatic) { From 390ced47cfeb96372923d290391659f4300b840c Mon Sep 17 00:00:00 2001 From: Xiaofei Wang <6218006+wangxf123456@users.noreply.github.com> Date: Thu, 3 Aug 2023 13:41:22 -0700 Subject: [PATCH 2/5] Add a test case --- tests/test_class_sh_basic.cpp | 14 ++++++++++++++ tests/test_class_sh_basic.py | 7 +++++++ 2 files changed, 21 insertions(+) diff --git a/tests/test_class_sh_basic.cpp b/tests/test_class_sh_basic.cpp index 502f48a2ca..6dfe229c7c 100644 --- a/tests/test_class_sh_basic.cpp +++ b/tests/test_class_sh_basic.cpp @@ -1,9 +1,12 @@ +#include #include #include "pybind11_tests.h" +#include #include #include +#include #include namespace pybind11_tests { @@ -80,6 +83,11 @@ struct SharedPtrStash { void Add(const std::shared_ptr &obj) { stash.push_back(obj); } }; +std::string pass_uq_cb(const std::function)> &cb) { + std::unique_ptr ptr = std::make_unique("pass_uq_cb"); + return cb(std::move(ptr)); +} + } // namespace class_sh_basic } // namespace pybind11_tests @@ -160,6 +168,12 @@ TEST_SUBMODULE(class_sh_basic, m) { m.def("args_shared_ptr_const", [](std::shared_ptr p) { return p; }); m.def("args_unique_ptr", [](std::unique_ptr p) { return p; }); m.def("args_unique_ptr_const", [](std::unique_ptr p) { return p; }); + + // Make sure unique_ptr type caster accept automatic_reference return value policy. + m.def("pass_uq_cb", + &pass_uq_cb, + pybind11::arg("cb").policies(pybind11::return_value_policy_pack( + pybind11::return_value_policy::automatic_reference))); } } // namespace class_sh_basic diff --git a/tests/test_class_sh_basic.py b/tests/test_class_sh_basic.py index 95460d9dc5..7b7071adbc 100644 --- a/tests/test_class_sh_basic.py +++ b/tests/test_class_sh_basic.py @@ -181,3 +181,10 @@ def test_function_signatures(doc): doc(m.args_unique_ptr_const) == "args_unique_ptr_const(arg0: m.class_sh_basic.atyp) -> m.class_sh_basic.atyp" ) + + +def test_unique_ptr_return_value_policy_automatic_reference(): + def cb(atyp): + return m.get_mtxt(atyp) + + assert m.pass_uq_cb(cb) == "pass_uq_cb" From f966d637d68a3134e336507b3a92bf3d7d46ddf3 Mon Sep 17 00:00:00 2001 From: Xiaofei Wang <6218006+wangxf123456@users.noreply.github.com> Date: Thu, 3 Aug 2023 13:50:04 -0700 Subject: [PATCH 3/5] Remove the test case --- tests/test_class_sh_basic.cpp | 14 -------------- tests/test_class_sh_basic.py | 7 ------- 2 files changed, 21 deletions(-) diff --git a/tests/test_class_sh_basic.cpp b/tests/test_class_sh_basic.cpp index 6dfe229c7c..502f48a2ca 100644 --- a/tests/test_class_sh_basic.cpp +++ b/tests/test_class_sh_basic.cpp @@ -1,12 +1,9 @@ -#include #include #include "pybind11_tests.h" -#include #include #include -#include #include namespace pybind11_tests { @@ -83,11 +80,6 @@ struct SharedPtrStash { void Add(const std::shared_ptr &obj) { stash.push_back(obj); } }; -std::string pass_uq_cb(const std::function)> &cb) { - std::unique_ptr ptr = std::make_unique("pass_uq_cb"); - return cb(std::move(ptr)); -} - } // namespace class_sh_basic } // namespace pybind11_tests @@ -168,12 +160,6 @@ TEST_SUBMODULE(class_sh_basic, m) { m.def("args_shared_ptr_const", [](std::shared_ptr p) { return p; }); m.def("args_unique_ptr", [](std::unique_ptr p) { return p; }); m.def("args_unique_ptr_const", [](std::unique_ptr p) { return p; }); - - // Make sure unique_ptr type caster accept automatic_reference return value policy. - m.def("pass_uq_cb", - &pass_uq_cb, - pybind11::arg("cb").policies(pybind11::return_value_policy_pack( - pybind11::return_value_policy::automatic_reference))); } } // namespace class_sh_basic diff --git a/tests/test_class_sh_basic.py b/tests/test_class_sh_basic.py index 7b7071adbc..95460d9dc5 100644 --- a/tests/test_class_sh_basic.py +++ b/tests/test_class_sh_basic.py @@ -181,10 +181,3 @@ def test_function_signatures(doc): doc(m.args_unique_ptr_const) == "args_unique_ptr_const(arg0: m.class_sh_basic.atyp) -> m.class_sh_basic.atyp" ) - - -def test_unique_ptr_return_value_policy_automatic_reference(): - def cb(atyp): - return m.get_mtxt(atyp) - - assert m.pass_uq_cb(cb) == "pass_uq_cb" From 1a10b1653fe78b02d60e88c3a8f719e3a3ec7c1d Mon Sep 17 00:00:00 2001 From: Xiaofei Wang <6218006+wangxf123456@users.noreply.github.com> Date: Thu, 3 Aug 2023 13:54:21 -0700 Subject: [PATCH 4/5] Add another test case --- tests/test_class_sh_basic.cpp | 6 ++++++ tests/test_class_sh_basic.py | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/tests/test_class_sh_basic.cpp b/tests/test_class_sh_basic.cpp index 502f48a2ca..c39768f142 100644 --- a/tests/test_class_sh_basic.cpp +++ b/tests/test_class_sh_basic.cpp @@ -160,6 +160,12 @@ TEST_SUBMODULE(class_sh_basic, m) { m.def("args_shared_ptr_const", [](std::shared_ptr p) { return p; }); m.def("args_unique_ptr", [](std::unique_ptr p) { return p; }); m.def("args_unique_ptr_const", [](std::unique_ptr p) { return p; }); + + // Make sure unique_ptr type caster accept automatic_reference return value policy. + m.def( + "rtrn_uq_automatic_reference", + []() { return std::make_unique("rtrn_uq_automatic_reference"); }, + pybind11::return_value_policy::automatic_reference); } } // namespace class_sh_basic diff --git a/tests/test_class_sh_basic.py b/tests/test_class_sh_basic.py index 95460d9dc5..268e793985 100644 --- a/tests/test_class_sh_basic.py +++ b/tests/test_class_sh_basic.py @@ -181,3 +181,7 @@ def test_function_signatures(doc): doc(m.args_unique_ptr_const) == "args_unique_ptr_const(arg0: m.class_sh_basic.atyp) -> m.class_sh_basic.atyp" ) + + +def test_unique_ptr_return_value_policy_automatic_reference(): + assert m.get_mtxt(m.rtrn_uq_automatic_reference()) == "rtrn_uq_automatic_reference" From 2a82c512814851a104cab7980f77a42b31ed4218 Mon Sep 17 00:00:00 2001 From: Xiaofei Wang <6218006+wangxf123456@users.noreply.github.com> Date: Thu, 3 Aug 2023 14:02:26 -0700 Subject: [PATCH 5/5] Fix test case --- tests/test_class_sh_basic.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_class_sh_basic.cpp b/tests/test_class_sh_basic.cpp index c39768f142..7582cfa044 100644 --- a/tests/test_class_sh_basic.cpp +++ b/tests/test_class_sh_basic.cpp @@ -164,7 +164,7 @@ TEST_SUBMODULE(class_sh_basic, m) { // Make sure unique_ptr type caster accept automatic_reference return value policy. m.def( "rtrn_uq_automatic_reference", - []() { return std::make_unique("rtrn_uq_automatic_reference"); }, + []() { return std::unique_ptr(new atyp("rtrn_uq_automatic_reference")); }, pybind11::return_value_policy::automatic_reference); }