pass_shared_vrederived test

parent a9470095
...@@ -45,6 +45,8 @@ class vderived : public vbase { ...@@ -45,6 +45,8 @@ class vderived : public vbase {
int base_get_int(const vbase& base) { return get_int() + base.get_int(); } int base_get_int(const vbase& base) { return get_int() + base.get_int(); }
}; };
class vrederived : public vderived {};
inline std::unique_ptr<cbase> inline std::unique_ptr<cbase>
make_unique_cderived_up_cast() { make_unique_cderived_up_cast() {
// Undefined Behavior (pure C++ problem, NOT a pybind11 problem): // Undefined Behavior (pure C++ problem, NOT a pybind11 problem):
...@@ -110,6 +112,10 @@ inline int pass_shared_vderived(std::shared_ptr<vderived> vd) { ...@@ -110,6 +112,10 @@ inline int pass_shared_vderived(std::shared_ptr<vderived> vd) {
return vd->get_int(); return vd->get_int();
} }
inline int pass_shared_vrederived(std::shared_ptr<vrederived> vr) {
return vr->get_int();
}
TEST_SUBMODULE(smart_ptr_base_derived, m) { TEST_SUBMODULE(smart_ptr_base_derived, m) {
m.def("to_cout", to_cout); m.def("to_cout", to_cout);
...@@ -127,6 +133,9 @@ TEST_SUBMODULE(smart_ptr_base_derived, m) { ...@@ -127,6 +133,9 @@ TEST_SUBMODULE(smart_ptr_base_derived, m) {
py::class_<vderived, vbase, std::shared_ptr<vderived>>(m, "vderived") py::class_<vderived, vbase, std::shared_ptr<vderived>>(m, "vderived")
.def(py::init<>()); .def(py::init<>());
py::class_<vrederived, vderived, std::shared_ptr<vrederived>>(m, "vrederived")
.def(py::init<>());
m.def("make_shared_cderived", m.def("make_shared_cderived",
make_shared_cderived, make_shared_cderived,
py::arg("use_custom_deleter") = false); py::arg("use_custom_deleter") = false);
...@@ -144,6 +153,7 @@ TEST_SUBMODULE(smart_ptr_base_derived, m) { ...@@ -144,6 +153,7 @@ TEST_SUBMODULE(smart_ptr_base_derived, m) {
py::arg("use_custom_deleter") = false); py::arg("use_custom_deleter") = false);
m.def("pass_shared_vbase", pass_shared_vbase); m.def("pass_shared_vbase", pass_shared_vbase);
m.def("pass_shared_vderived", pass_shared_vderived); m.def("pass_shared_vderived", pass_shared_vderived);
m.def("pass_shared_vrederived", pass_shared_vrederived);
} }
} // namespace smart_ptr_base_derived } // namespace smart_ptr_base_derived
......
...@@ -30,8 +30,11 @@ def test_virtual(): ...@@ -30,8 +30,11 @@ def test_virtual():
assert vd.get_int() == VDERIVED_GET_INT_RESULT assert vd.get_int() == VDERIVED_GET_INT_RESULT
m.pass_shared_vderived(vd) m.pass_shared_vderived(vd)
m.pass_shared_vbase(vd) m.pass_shared_vbase(vd)
vb = m.make_shared_vderived_up_cast() vd_uc = m.make_shared_vderived_up_cast()
assert vb.get_int() == VDERIVED_GET_INT_RESULT assert vd_uc.get_int() == VDERIVED_GET_INT_RESULT
m.pass_shared_vbase(vb) assert isinstance(vd_uc, m.vderived) # pybind11 un-did upcast.
m.pass_shared_vderived(vb) m.pass_shared_vbase(vd_uc) # HOW DOES THIS UPCAST HAPPEN?
m.pass_shared_vderived(vd_uc)
with pytest.raises(TypeError):
m.pass_shared_vrederived(vd_uc)
m.to_cout("") m.to_cout("")
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment