Skip to content

Commit b08cade

Browse files
committed
fix rv policy inference rules (fixes issue #39)
1 parent 238a9fe commit b08cade

File tree

3 files changed

+17
-1
lines changed

3 files changed

+17
-1
lines changed

include/nanobind/nb_cast.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,9 @@ template <typename T> NB_INLINE rv_policy infer_policy(rv_policy policy) {
218218
policy = rv_policy::copy;
219219
} else {
220220
if (policy == rv_policy::automatic ||
221-
policy == rv_policy::automatic_reference)
221+
policy == rv_policy::automatic_reference ||
222+
policy == rv_policy::reference ||
223+
policy == rv_policy::reference_internal)
222224
policy = rv_policy::move;
223225
}
224226
return policy;

tests/test_enum.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ enum class Enum : uint32_t { A, B, C = (uint32_t) -1 };
66
enum class SEnum : int32_t { A, B, C = (int32_t) -1 };
77
enum ClassicEnum { Item1, Item2 };
88

9+
struct EnumProperty { Enum get_enum() { return Enum::A; } };
10+
11+
912
NB_MODULE(test_enum_ext, m) {
1013
nb::enum_<Enum>(m, "Enum")
1114
.value("A", Enum::A, "Value A")
@@ -25,4 +28,9 @@ NB_MODULE(test_enum_ext, m) {
2528
m.def("from_enum", [](Enum value) { return (uint32_t) value; });
2629
m.def("to_enum", [](uint32_t value) { return (Enum) value; });
2730
m.def("from_enum", [](SEnum value) { return (int32_t) value; });
31+
32+
// test for issue #39
33+
nb::class_<EnumProperty>(m, "EnumProperty")
34+
.def(nb::init<>())
35+
.def_property_readonly("read_enum", &EnumProperty::get_enum);
2836
}

tests/test_enum.py

+6
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,9 @@ def test03_enum_arithmetic():
7070
def test04_enum_export():
7171
assert t.Item1 is t.ClassicEnum.Item1 and int(t.Item1) == 0
7272
assert t.Item2 is t.ClassicEnum.Item2 and int(t.Item2) == 1
73+
74+
# test for issue #39
75+
def test05_enum_property():
76+
w = t.EnumProperty()
77+
assert w.read_enum == t.Enum.A
78+
assert str(w.read_enum) == 'test_enum_ext.Enum.A'

0 commit comments

Comments
 (0)