@@ -29,6 +29,34 @@ int get_from_cpp_plainc_ptr(const Base *b) { return b->get() + 4000; }
2929
3030int get_from_cpp_unique_ptr (std::unique_ptr<Base> b) { return b->get () + 5000 ; }
3131
32+
33+ // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
34+
35+ struct VirtualItem
36+ {
37+ VirtualItem () = default ;
38+ virtual ~VirtualItem () = default ;
39+ virtual int get () const = 0;
40+ };
41+
42+ struct VirtualItemTrampoline : public VirtualItem , py::trampoline_self_life_support
43+ {
44+ int get () const override { PYBIND11_OVERRIDE_PURE (int , VirtualItem, get, ); }
45+ };
46+
47+ struct VirtualItemContainer
48+ {
49+ std::shared_ptr<VirtualItem> held;
50+ // ...
51+ };
52+
53+ void cpp_space_test (std::shared_ptr<VirtualItemContainer> container_vec)
54+ {
55+ auto i = container_vec->held ->get (); // segfaults
56+ }
57+
58+ // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
59+
3260struct BaseVirtualOverrider : Base, py::trampoline_self_life_support {
3361 using Base::Base;
3462
@@ -55,4 +83,19 @@ TEST_SUBMODULE(class_sh_virtual_py_cpp_mix, m) {
5583
5684 m.def (" get_from_cpp_plainc_ptr" , get_from_cpp_plainc_ptr, py::arg (" b" ));
5785 m.def (" get_from_cpp_unique_ptr" , get_from_cpp_unique_ptr, py::arg (" b" ));
86+
87+ // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
88+
89+ py::classh<VirtualItem, VirtualItemTrampoline>(m, " VirtualItem" )
90+ .def (py::init<>())
91+ .def (" get" , &VirtualItem::get)
92+ ;
93+
94+ py::classh<VirtualItemContainer>(m, " VirtualItemContainer" )
95+ .def (py::init<std::shared_ptr<VirtualItem>>())
96+ ;
97+
98+ m.def (" cpp_space_test" , cpp_space_test);
99+
100+ // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
58101}
0 commit comments