diff --git a/include/pybind11/cast.h b/include/pybind11/cast.h index 945e9e93..4f072480 100644 --- a/include/pybind11/cast.h +++ b/include/pybind11/cast.h @@ -1171,6 +1171,7 @@ struct return_value_policy_override< static return_value_policy policy(return_value_policy p) { return !std::is_lvalue_reference::value && !std::is_pointer::value && p != return_value_policy::_clif_automatic + && p != return_value_policy::_return_as_bytes ? return_value_policy::move : p; } diff --git a/include/pybind11/stl.h b/include/pybind11/stl.h index ae81a70e..804d9617 100644 --- a/include/pybind11/stl.h +++ b/include/pybind11/stl.h @@ -187,9 +187,9 @@ struct set_caster { template static handle cast(T &&src, const return_value_policy_pack &rvpp, handle parent) { - return_value_policy_pack rvpp_local = rvpp; + return_value_policy_pack rvpp_local = rvpp.get(0); if (!std::is_lvalue_reference::value) { - rvpp_local = rvpp.override_policy(return_value_policy_override::policy); + rvpp_local = rvpp_local.override_policy(return_value_policy_override::policy); } pybind11::set s; for (auto &&value : src) { @@ -323,9 +323,9 @@ struct list_caster { public: template static handle cast(T &&src, const return_value_policy_pack &rvpp, handle parent) { - return_value_policy_pack rvpp_local = rvpp; + return_value_policy_pack rvpp_local = rvpp.get(0); if (!std::is_lvalue_reference::value) { - rvpp_local = rvpp.override_policy(return_value_policy_override::policy); + rvpp_local = rvpp_local.override_policy(return_value_policy_override::policy); } list l(src.size()); ssize_t index = 0; @@ -406,11 +406,12 @@ struct array_caster { template static handle cast(T &&src, const return_value_policy_pack &rvpp, handle parent) { + return_value_policy_pack rvpp_local = rvpp.get(0); list l(src.size()); ssize_t index = 0; for (auto &&value : src) { auto value_ = reinterpret_steal( - value_conv::cast(detail::forward_like(value), rvpp, parent)); + value_conv::cast(detail::forward_like(value), rvpp_local, parent)); if (!value_) { return handle(); } @@ -461,9 +462,9 @@ struct optional_caster { if (!src) { return none().release(); } - return_value_policy_pack rvpp_local = rvpp; + return_value_policy_pack rvpp_local = rvpp.get(0); if (!std::is_lvalue_reference::value) { - rvpp_local = rvpp.override_policy(return_value_policy_override::policy); + rvpp_local = rvpp_local.override_policy(return_value_policy_override::policy); } // NOLINTNEXTLINE(bugprone-unchecked-optional-access) return value_conv::cast(*std::forward(src), rvpp_local, parent); diff --git a/tests/test_return_value_policy_pack.cpp b/tests/test_return_value_policy_pack.cpp index 6fbaed68..4e257fe9 100644 --- a/tests/test_return_value_policy_pack.cpp +++ b/tests/test_return_value_policy_pack.cpp @@ -311,7 +311,7 @@ TEST_SUBMODULE(return_value_policy_pack, m) { m.def( "return_set_sb", []() { return return_set_pair_string(); }, - py::return_value_policy_pack({rvpc, rvpb})); + py::return_value_policy_pack({{rvpc, rvpb}})); m.def( "return_set_bs", []() { @@ -319,12 +319,12 @@ TEST_SUBMODULE(return_value_policy_pack, m) { static auto *s = new SetPairString(return_set_pair_string()); return s; }, - py::return_value_policy_pack({rvpb, rvpc})); + py::return_value_policy_pack({{rvpb, rvpc}})); m.def( "return_vector_sb", []() { return return_vector_pair_string(); }, - py::return_value_policy_pack({rvpc, rvpb})); + py::return_value_policy_pack({{rvpc, rvpb}})); m.def( "return_vector_bs", []() { @@ -332,12 +332,12 @@ TEST_SUBMODULE(return_value_policy_pack, m) { static auto *v = new VectorPairString(return_vector_pair_string()); return v; }, - py::return_value_policy_pack({rvpb, rvpc})); + py::return_value_policy_pack({{rvpb, rvpc}})); m.def( "return_array_sb", []() { return return_array_pair_string(); }, - py::return_value_policy_pack({rvpc, rvpb})); + py::return_value_policy_pack({{rvpc, rvpb}})); m.def( "return_array_bs", []() { @@ -345,7 +345,7 @@ TEST_SUBMODULE(return_value_policy_pack, m) { static auto *a = new ArrayPairString(return_array_pair_string()); return a; }, - py::return_value_policy_pack({rvpb, rvpc})); + py::return_value_policy_pack({{rvpb, rvpc}})); m.attr("PYBIND11_HAS_OPTIONAL") = #if !defined(PYBIND11_HAS_OPTIONAL) @@ -355,7 +355,7 @@ TEST_SUBMODULE(return_value_policy_pack, m) { m.def( "return_optional_sb", []() { return return_optional_pair_string(); }, - py::return_value_policy_pack({rvpc, rvpb})); + py::return_value_policy_pack({{rvpc, rvpb}})); m.def( "return_optional_bs", []() { @@ -363,7 +363,7 @@ TEST_SUBMODULE(return_value_policy_pack, m) { static auto *o = new OptionalPairString(return_optional_pair_string()); return o; }, - py::return_value_policy_pack({rvpb, rvpc})); + py::return_value_policy_pack({{rvpb, rvpc}})); #endif m.attr("PYBIND11_HAS_VARIANT") =