Add tests that cause crash in def_readwrite

- Occurs with non-smart-holder property of smart-holder class
This commit is contained in:
Dustin Spicuzza
2026-03-17 00:49:55 -04:00
parent cd538ed118
commit 6b7b3d27e6
2 changed files with 48 additions and 0 deletions

View File

@@ -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);
}

View File

@@ -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