mirror of
https://github.com/pybind/pybind11.git
synced 2026-05-12 09:17:42 +00:00
Add tests that cause crash in def_readwrite
- Occurs with non-smart-holder property of smart-holder class
This commit is contained in:
@@ -43,6 +43,23 @@ struct WithConstCharPtrMember {
|
||||
const char *const_char_ptr_member = "ConstChar*";
|
||||
};
|
||||
|
||||
enum class TinyLevel {
|
||||
A = 0,
|
||||
B = 1,
|
||||
};
|
||||
|
||||
struct HolderWithEnum {
|
||||
TinyLevel level = TinyLevel::A;
|
||||
};
|
||||
|
||||
struct LegacyThing {
|
||||
int value = 7;
|
||||
};
|
||||
|
||||
struct HolderWithLegacyMember {
|
||||
LegacyThing legacy;
|
||||
};
|
||||
|
||||
} // namespace test_class_sh_property
|
||||
|
||||
TEST_SUBMODULE(class_sh_property, m) {
|
||||
@@ -91,4 +108,18 @@ TEST_SUBMODULE(class_sh_property, m) {
|
||||
py::classh<WithConstCharPtrMember>(m, "WithConstCharPtrMember")
|
||||
.def(py::init<>())
|
||||
.def_readonly("const_char_ptr_member", &WithConstCharPtrMember::const_char_ptr_member);
|
||||
|
||||
py::enum_<TinyLevel>(m, "TinyLevel").value("A", TinyLevel::A).value("B", TinyLevel::B);
|
||||
|
||||
py::classh<HolderWithEnum>(m, "HolderWithEnum")
|
||||
.def(py::init<>())
|
||||
.def_readwrite("level", &HolderWithEnum::level);
|
||||
|
||||
py::class_<LegacyThing>(m, "LegacyThing")
|
||||
.def(py::init<>())
|
||||
.def_readwrite("value", &LegacyThing::value);
|
||||
|
||||
py::classh<HolderWithLegacyMember>(m, "HolderWithLegacyMember")
|
||||
.def(py::init<>())
|
||||
.def_readwrite("legacy", &HolderWithLegacyMember::legacy);
|
||||
}
|
||||
|
||||
@@ -164,3 +164,20 @@ def test_readonly_char6_member():
|
||||
def test_readonly_const_char_ptr_member():
|
||||
obj = m.WithConstCharPtrMember()
|
||||
assert obj.const_char_ptr_member == "ConstChar*"
|
||||
|
||||
|
||||
def test_enum_member_with_smart_holder_def_readwrite():
|
||||
obj = m.HolderWithEnum()
|
||||
assert obj.level == m.TinyLevel.A
|
||||
for _ in range(100):
|
||||
v = obj.level
|
||||
assert v == m.TinyLevel.A
|
||||
del v
|
||||
|
||||
|
||||
def test_non_smart_holder_member_type_with_smart_holder_owner():
|
||||
obj = m.HolderWithLegacyMember()
|
||||
for _ in range(1000):
|
||||
v = obj.legacy
|
||||
assert v.value == 7
|
||||
del v
|
||||
|
||||
Reference in New Issue
Block a user