Skip to content

Commit e9c6fe1

Browse files
committed
Revert "[smart_holder] Auto select return value policy for clif_automatic (#4381)"
This reverts commit c1f14f0. Conflicts resolved in: include/pybind11/detail/smart_holder_type_casters.h tests/test_return_value_policy_override.py
1 parent bfb5fce commit e9c6fe1

File tree

3 files changed

+2
-292
lines changed

3 files changed

+2
-292
lines changed

include/pybind11/detail/smart_holder_type_casters.h

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -753,30 +753,19 @@ struct smart_holder_type_caster : smart_holder_type_caster_load<T>,
753753
static handle cast(T const &src, return_value_policy policy, handle parent) {
754754
// type_caster_base BEGIN
755755
if (policy == return_value_policy::automatic
756-
|| policy == return_value_policy::automatic_reference
757-
|| policy == return_value_policy::_clif_automatic) {
756+
|| policy == return_value_policy::automatic_reference) {
758757
policy = return_value_policy::copy;
759758
}
760759
return cast(&src, policy, parent);
761760
// type_caster_base END
762761
}
763762

764763
static handle cast(T &src, return_value_policy policy, handle parent) {
765-
if (policy == return_value_policy::_clif_automatic) {
766-
if (is_move_constructible<T>::value) {
767-
policy = return_value_policy::move;
768-
} else {
769-
policy = return_value_policy::automatic;
770-
}
771-
}
772764
return cast(const_cast<T const &>(src), policy, parent); // Mutbl2Const
773765
}
774766

775767
static handle cast(T const *src, return_value_policy policy, handle parent) {
776768
auto st = type_caster_base<T>::src_and_type(src);
777-
if (policy == return_value_policy::_clif_automatic) {
778-
policy = return_value_policy::copy;
779-
}
780769
return cast_const_raw_ptr( // Originally type_caster_generic::cast.
781770
st.first,
782771
policy,
@@ -787,9 +776,6 @@ struct smart_holder_type_caster : smart_holder_type_caster_load<T>,
787776
}
788777

789778
static handle cast(T *src, return_value_policy policy, handle parent) {
790-
if (policy == return_value_policy::_clif_automatic) {
791-
policy = return_value_policy::reference;
792-
}
793779
return cast(const_cast<T const *>(src), policy, parent); // Mutbl2Const
794780
}
795781

@@ -1006,8 +992,7 @@ struct smart_holder_type_caster<std::unique_ptr<T, D>> : smart_holder_type_caste
1006992
if (policy != return_value_policy::automatic
1007993
&& policy != return_value_policy::automatic_reference
1008994
&& policy != return_value_policy::reference_internal
1009-
&& policy != return_value_policy::move
1010-
&& policy != return_value_policy::_clif_automatic) {
995+
&& policy != return_value_policy::move) {
1011996
// SMART_HOLDER_WIP: IMPROVABLE: Error message.
1012997
throw cast_error("Invalid return_value_policy for unique_ptr.");
1013998
}
Lines changed: 0 additions & 241 deletions
Original file line numberDiff line numberDiff line change
@@ -1,166 +1,12 @@
1-
#include <pybind11/smart_holder.h>
2-
31
#include "pybind11_tests.h"
42

53
namespace test_return_value_policy_override {
64

75
struct some_type {};
86

9-
// cp = copyable, mv = movable, 1 = yes, 0 = no
10-
struct type_cp1_mv1 {
11-
std::string mtxt;
12-
explicit type_cp1_mv1(const std::string &mtxt_) : mtxt(mtxt_) {}
13-
type_cp1_mv1(const type_cp1_mv1 &other) { mtxt = other.mtxt + "_CpCtor"; }
14-
type_cp1_mv1(type_cp1_mv1 &&other) noexcept { mtxt = other.mtxt + "_MvCtor"; }
15-
type_cp1_mv1 &operator=(const type_cp1_mv1 &other) {
16-
mtxt = other.mtxt + "_CpCtor";
17-
return *this;
18-
}
19-
type_cp1_mv1 &operator=(type_cp1_mv1 &&other) noexcept {
20-
mtxt = other.mtxt + "_MvCtor";
21-
return *this;
22-
}
23-
};
24-
25-
// nocopy
26-
struct type_cp0_mv1 {
27-
std::string mtxt;
28-
explicit type_cp0_mv1(const std::string &mtxt_) : mtxt(mtxt_) {}
29-
type_cp0_mv1(const type_cp0_mv1 &) = delete;
30-
type_cp0_mv1(type_cp0_mv1 &&other) noexcept { mtxt = other.mtxt + "_MvCtor"; }
31-
type_cp0_mv1 &operator=(const type_cp0_mv1 &) = delete;
32-
type_cp0_mv1 &operator=(type_cp0_mv1 &&other) noexcept {
33-
mtxt = other.mtxt + "_MvCtor";
34-
return *this;
35-
}
36-
};
37-
38-
// nomove
39-
struct type_cp1_mv0 {
40-
std::string mtxt;
41-
explicit type_cp1_mv0(const std::string &mtxt_) : mtxt(mtxt_) {}
42-
type_cp1_mv0(const type_cp1_mv0 &other) { mtxt = other.mtxt + "_CpCtor"; }
43-
type_cp1_mv0(type_cp1_mv0 &&other) = delete;
44-
type_cp1_mv0 &operator=(const type_cp1_mv0 &other) {
45-
mtxt = other.mtxt + "_CpCtor";
46-
return *this;
47-
}
48-
type_cp1_mv0 &operator=(type_cp1_mv0 &&other) = delete;
49-
};
50-
51-
// nocopy_nomove
52-
struct type_cp0_mv0 {
53-
std::string mtxt;
54-
explicit type_cp0_mv0(const std::string &mtxt_) : mtxt(mtxt_) {}
55-
type_cp0_mv0(const type_cp0_mv0 &) = delete;
56-
type_cp0_mv0(type_cp0_mv0 &&other) = delete;
57-
type_cp0_mv0 &operator=(const type_cp0_mv0 &other) = delete;
58-
type_cp0_mv0 &operator=(type_cp0_mv0 &&other) = delete;
59-
};
60-
61-
type_cp1_mv1 return_value() { return type_cp1_mv1{"value"}; }
62-
63-
type_cp1_mv1 *return_pointer() {
64-
static type_cp1_mv1 value("pointer");
65-
return &value;
66-
}
67-
68-
const type_cp1_mv1 *return_const_pointer() {
69-
static type_cp1_mv1 value("const_pointer");
70-
return &value;
71-
}
72-
73-
type_cp1_mv1 &return_reference() {
74-
static type_cp1_mv1 value("reference");
75-
return value;
76-
}
77-
78-
const type_cp1_mv1 &return_const_reference() {
79-
static type_cp1_mv1 value("const_reference");
80-
return value;
81-
}
82-
83-
std::shared_ptr<type_cp1_mv1> return_shared_pointer() {
84-
return std::make_shared<type_cp1_mv1>("shared_pointer");
85-
}
86-
87-
std::unique_ptr<type_cp1_mv1> return_unique_pointer() {
88-
return std::unique_ptr<type_cp1_mv1>(new type_cp1_mv1("unique_pointer"));
89-
}
90-
91-
type_cp0_mv1 return_value_nocopy() { return type_cp0_mv1{"value_nocopy"}; }
92-
93-
type_cp0_mv1 *return_pointer_nocopy() {
94-
static type_cp0_mv1 value("pointer_nocopy");
95-
return &value;
96-
}
97-
98-
const type_cp0_mv1 *return_const_pointer_nocopy() {
99-
static type_cp0_mv1 value("const_pointer_nocopy");
100-
return &value;
101-
}
102-
103-
type_cp0_mv1 &return_reference_nocopy() {
104-
static type_cp0_mv1 value("reference_nocopy");
105-
return value;
106-
}
107-
108-
std::shared_ptr<type_cp0_mv1> return_shared_pointer_nocopy() {
109-
return std::make_shared<type_cp0_mv1>("shared_pointer_nocopy");
110-
}
111-
112-
std::unique_ptr<type_cp0_mv1> return_unique_pointer_nocopy() {
113-
return std::unique_ptr<type_cp0_mv1>(new type_cp0_mv1("unique_pointer_nocopy"));
114-
}
115-
116-
type_cp1_mv0 *return_pointer_nomove() {
117-
static type_cp1_mv0 value("pointer_nomove");
118-
return &value;
119-
}
120-
121-
const type_cp1_mv0 *return_const_pointer_nomove() {
122-
static type_cp1_mv0 value("const_pointer_nomove");
123-
return &value;
124-
}
125-
126-
type_cp1_mv0 &return_reference_nomove() {
127-
static type_cp1_mv0 value("reference_nomove");
128-
return value;
129-
}
130-
131-
const type_cp1_mv0 &return_const_reference_nomove() {
132-
static type_cp1_mv0 value("const_reference_nomove");
133-
return value;
134-
}
135-
136-
std::shared_ptr<type_cp1_mv0> return_shared_pointer_nomove() {
137-
return std::make_shared<type_cp1_mv0>("shared_pointer_nomove");
138-
}
139-
140-
std::unique_ptr<type_cp1_mv0> return_unique_pointer_nomove() {
141-
return std::unique_ptr<type_cp1_mv0>(new type_cp1_mv0("unique_pointer_nomove"));
142-
}
143-
144-
type_cp0_mv0 *return_pointer_nocopy_nomove() {
145-
static type_cp0_mv0 value("pointer_nocopy_nomove");
146-
return &value;
147-
}
148-
149-
std::shared_ptr<type_cp0_mv0> return_shared_pointer_nocopy_nomove() {
150-
return std::make_shared<type_cp0_mv0>("shared_pointer_nocopy_nomove");
151-
}
152-
153-
std::unique_ptr<type_cp0_mv0> return_unique_pointer_nocopy_nomove() {
154-
return std::unique_ptr<type_cp0_mv0>(new type_cp0_mv0("unique_pointer_nocopy_nomove"));
155-
}
156-
1577
} // namespace test_return_value_policy_override
1588

1599
using test_return_value_policy_override::some_type;
160-
using test_return_value_policy_override::type_cp0_mv0;
161-
using test_return_value_policy_override::type_cp0_mv1;
162-
using test_return_value_policy_override::type_cp1_mv0;
163-
using test_return_value_policy_override::type_cp1_mv1;
16410

16511
namespace pybind11 {
16612
namespace detail {
@@ -205,11 +51,6 @@ struct type_caster<some_type> : type_caster_base<some_type> {
20551
} // namespace detail
20652
} // namespace pybind11
20753

208-
PYBIND11_SMART_HOLDER_TYPE_CASTERS(type_cp1_mv1)
209-
PYBIND11_SMART_HOLDER_TYPE_CASTERS(type_cp0_mv1)
210-
PYBIND11_SMART_HOLDER_TYPE_CASTERS(type_cp1_mv0)
211-
PYBIND11_SMART_HOLDER_TYPE_CASTERS(type_cp0_mv0)
212-
21354
TEST_SUBMODULE(return_value_policy_override, m) {
21455
m.def("return_value_with_default_policy", []() { return some_type(); });
21556
m.def(
@@ -238,86 +79,4 @@ TEST_SUBMODULE(return_value_policy_override, m) {
23879
return &value;
23980
},
24081
py::return_value_policy::_clif_automatic);
241-
242-
py::classh<type_cp1_mv1>(m, "type_cp1_mv1")
243-
.def(py::init<std::string>())
244-
.def_readonly("mtxt", &type_cp1_mv1::mtxt);
245-
m.def("return_value",
246-
&test_return_value_policy_override::return_value,
247-
py::return_value_policy::_clif_automatic);
248-
m.def("return_pointer",
249-
&test_return_value_policy_override::return_pointer,
250-
py::return_value_policy::_clif_automatic);
251-
m.def("return_const_pointer",
252-
&test_return_value_policy_override::return_const_pointer,
253-
py::return_value_policy::_clif_automatic);
254-
m.def("return_reference",
255-
&test_return_value_policy_override::return_reference,
256-
py::return_value_policy::_clif_automatic);
257-
m.def("return_const_reference",
258-
&test_return_value_policy_override::return_const_reference,
259-
py::return_value_policy::_clif_automatic);
260-
m.def("return_unique_pointer",
261-
&test_return_value_policy_override::return_unique_pointer,
262-
py::return_value_policy::_clif_automatic);
263-
m.def("return_shared_pointer",
264-
&test_return_value_policy_override::return_shared_pointer,
265-
py::return_value_policy::_clif_automatic);
266-
267-
py::classh<type_cp0_mv1>(m, "type_cp0_mv1")
268-
.def(py::init<std::string>())
269-
.def_readonly("mtxt", &type_cp0_mv1::mtxt);
270-
m.def("return_value_nocopy",
271-
&test_return_value_policy_override::return_value_nocopy,
272-
py::return_value_policy::_clif_automatic);
273-
m.def("return_pointer_nocopy",
274-
&test_return_value_policy_override::return_pointer_nocopy,
275-
py::return_value_policy::_clif_automatic);
276-
m.def("return_const_pointer_nocopy",
277-
&test_return_value_policy_override::return_const_pointer_nocopy,
278-
py::return_value_policy::_clif_automatic);
279-
m.def("return_reference_nocopy",
280-
&test_return_value_policy_override::return_reference_nocopy,
281-
py::return_value_policy::_clif_automatic);
282-
m.def("return_shared_pointer_nocopy",
283-
&test_return_value_policy_override::return_shared_pointer_nocopy,
284-
py::return_value_policy::_clif_automatic);
285-
m.def("return_unique_pointer_nocopy",
286-
&test_return_value_policy_override::return_unique_pointer_nocopy,
287-
py::return_value_policy::_clif_automatic);
288-
289-
py::classh<type_cp1_mv0>(m, "type_cp1_mv0")
290-
.def(py::init<std::string>())
291-
.def_readonly("mtxt", &type_cp1_mv0::mtxt);
292-
m.def("return_pointer_nomove",
293-
&test_return_value_policy_override::return_pointer_nomove,
294-
py::return_value_policy::_clif_automatic);
295-
m.def("return_const_pointer_nomove",
296-
&test_return_value_policy_override::return_const_pointer_nomove,
297-
py::return_value_policy::_clif_automatic);
298-
m.def("return_reference_nomove",
299-
&test_return_value_policy_override::return_reference_nomove,
300-
py::return_value_policy::_clif_automatic);
301-
m.def("return_const_reference_nomove",
302-
&test_return_value_policy_override::return_const_reference_nomove,
303-
py::return_value_policy::_clif_automatic);
304-
m.def("return_shared_pointer_nomove",
305-
&test_return_value_policy_override::return_shared_pointer_nomove,
306-
py::return_value_policy::_clif_automatic);
307-
m.def("return_unique_pointer_nomove",
308-
&test_return_value_policy_override::return_unique_pointer_nomove,
309-
py::return_value_policy::_clif_automatic);
310-
311-
py::classh<type_cp0_mv0>(m, "type_cp0_mv0")
312-
.def(py::init<std::string>())
313-
.def_readonly("mtxt", &type_cp0_mv0::mtxt);
314-
m.def("return_pointer_nocopy_nomove",
315-
&test_return_value_policy_override::return_pointer_nocopy_nomove,
316-
py::return_value_policy::_clif_automatic);
317-
m.def("return_shared_pointer_nocopy_nomove",
318-
&test_return_value_policy_override::return_shared_pointer_nocopy_nomove,
319-
py::return_value_policy::_clif_automatic);
320-
m.def("return_unique_pointer_nocopy_nomove",
321-
&test_return_value_policy_override::return_unique_pointer_nocopy_nomove,
322-
py::return_value_policy::_clif_automatic);
32382
}
Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
import re
2-
3-
import pytest
4-
51
from pybind11_tests import return_value_policy_override as m
62

73

@@ -15,33 +11,3 @@ def test_return_pointer():
1511
assert m.return_pointer_with_default_policy() == "automatic"
1612
assert m.return_pointer_with_policy_move() == "move"
1713
assert m.return_pointer_with_policy_clif_automatic() == "_clif_automatic"
18-
19-
20-
@pytest.mark.parametrize(
21-
("func", "expected"),
22-
[
23-
(m.return_value, "value(_MvCtor)*_MvCtor"),
24-
(m.return_pointer, "pointer"),
25-
(m.return_const_pointer, "const_pointer_CpCtor"),
26-
(m.return_reference, "reference_MvCtor"),
27-
(m.return_const_reference, "const_reference_CpCtor"),
28-
(m.return_unique_pointer, "unique_pointer"),
29-
(m.return_shared_pointer, "shared_pointer"),
30-
(m.return_value_nocopy, "value_nocopy(_MvCtor)*_MvCtor"),
31-
(m.return_pointer_nocopy, "pointer_nocopy"),
32-
(m.return_reference_nocopy, "reference_nocopy_MvCtor"),
33-
(m.return_unique_pointer_nocopy, "unique_pointer_nocopy"),
34-
(m.return_shared_pointer_nocopy, "shared_pointer_nocopy"),
35-
(m.return_pointer_nomove, "pointer_nomove"),
36-
(m.return_const_pointer_nomove, "const_pointer_nomove_CpCtor"),
37-
(m.return_reference_nomove, "reference_nomove_CpCtor"),
38-
(m.return_const_reference_nomove, "const_reference_nomove_CpCtor"),
39-
(m.return_unique_pointer_nomove, "unique_pointer_nomove"),
40-
(m.return_shared_pointer_nomove, "shared_pointer_nomove"),
41-
(m.return_pointer_nocopy_nomove, "pointer_nocopy_nomove"),
42-
(m.return_unique_pointer_nocopy_nomove, "unique_pointer_nocopy_nomove"),
43-
(m.return_shared_pointer_nocopy_nomove, "shared_pointer_nocopy_nomove"),
44-
],
45-
)
46-
def test_clif_automatic_return_value_policy_override(func, expected):
47-
assert re.match(expected, func().mtxt)

0 commit comments

Comments
 (0)