Skip to content

Commit

Permalink
cast.h return_value_policy_override _clif_automatic (pybind#4364)
Browse files Browse the repository at this point in the history
  • Loading branch information
Ralf W. Grosse-Kunstleve committed Nov 28, 2022
1 parent 341bc8a commit 8720cf9
Show file tree
Hide file tree
Showing 4 changed files with 97 additions and 0 deletions.
1 change: 1 addition & 0 deletions include/pybind11/cast.h
Original file line number Diff line number Diff line change
Expand Up @@ -1042,6 +1042,7 @@ struct return_value_policy_override<
void>> {
static return_value_policy policy(return_value_policy p) {
return !std::is_lvalue_reference<Return>::value && !std::is_pointer<Return>::value
&& p != return_value_policy::_clif_automatic
? return_value_policy::move
: p;
}
Expand Down
1 change: 1 addition & 0 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,7 @@ set(PYBIND11_TEST_FILES
test_operator_overloading
test_pickling
test_pytypes
test_return_value_policy_override
test_sequences_and_iterators
test_smart_ptr
test_stl
Expand Down
82 changes: 82 additions & 0 deletions tests/test_return_value_policy_override.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
#include "pybind11_tests.h"

namespace test_return_value_policy_override {

struct some_type {};

} // namespace test_return_value_policy_override

using test_return_value_policy_override::some_type;

namespace pybind11 {
namespace detail {

const char *return_value_policy_name(return_value_policy policy) {
switch (policy) {
case return_value_policy::automatic:
return "automatic";
case return_value_policy::automatic_reference:
return "automatic_reference";
case return_value_policy::take_ownership:
return "take_ownership";
case return_value_policy::copy:
return "copy";
case return_value_policy::move:
return "move";
case return_value_policy::reference:
return "reference";
case return_value_policy::reference_internal:
return "reference_internal";
case return_value_policy::_return_as_bytes:
return "_return_as_bytes";
case return_value_policy::_clif_automatic:
return "_clif_automatic";
default:
return "Expected to be unreachable.";
}
};

template <>
struct type_caster<some_type> : type_caster_base<some_type> {

static handle cast(some_type &&, return_value_policy policy, handle /*parent*/) {
return str(std::string(return_value_policy_name(policy))).release().ptr();
}

static handle cast(some_type *, return_value_policy policy, handle /*parent*/) {
return str(std::string(return_value_policy_name(policy))).release().ptr();
}
};

} // namespace detail
} // namespace pybind11

TEST_SUBMODULE(return_value_policy_override, m) {
m.def("return_value_with_default_policy", []() { return some_type(); });
m.def(
"return_value_with_policy_copy",
[]() { return some_type(); },
py::return_value_policy::copy);
m.def(
"return_value_with_policy_clif_automatic",
[]() { return some_type(); },
py::return_value_policy::_clif_automatic);
m.def("return_pointer_with_default_policy", []() {
static some_type value;
return &value;
});
m.def(
"return_pointer_with_policy_move",
[]() {
static some_type value;
return &value;
},
py::return_value_policy::move);
m.def(
"return_pointer_with_policy_clif_automatic",
[]() {
static some_type value;
return &value;
},
py::return_value_policy::_clif_automatic);
}
13 changes: 13 additions & 0 deletions tests/test_return_value_policy_override.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from pybind11_tests import return_value_policy_override as m


def test_return_value():
assert m.return_value_with_default_policy() == "move"
assert m.return_value_with_policy_copy() == "move"
assert m.return_value_with_policy_clif_automatic() == "_clif_automatic"


def test_return_pointer():
assert m.return_pointer_with_default_policy() == "automatic"
assert m.return_pointer_with_policy_move() == "move"
assert m.return_pointer_with_policy_clif_automatic() == "_clif_automatic"

0 comments on commit 8720cf9

Please sign in to comment.