@@ -184,6 +184,46 @@ TEST_SUBMODULE(class_, m) {
184184 auto def = new PyMethodDef{" f" , f, METH_VARARGS, nullptr };
185185 return py::reinterpret_steal<py::object>(PyCFunction_NewEx (def, nullptr , m.ptr ()));
186186 }());
187+
188+ // test_operator_new_delete
189+ struct HasOpNewDel {
190+ std::uint64_t i;
191+ static void *operator new (size_t s) { py::print (" A new" , s); return ::operator new (s); }
192+ static void *operator new (size_t s, void *ptr) { py::print (" A placement-new" , s); return ptr; }
193+ static void operator delete (void *p) { py::print (" A delete" ); return ::operator delete (p); }
194+ };
195+ struct HasOpNewDelSize {
196+ std::uint32_t i;
197+ static void *operator new (size_t s) { py::print (" B new" , s); return ::operator new (s); }
198+ static void *operator new (size_t s, void *ptr) { py::print (" B placement-new" , s); return ptr; }
199+ static void operator delete (void *p, size_t s) { py::print (" B delete" , s); return ::operator delete (p); }
200+ };
201+ struct AliasedHasOpNewDelSize {
202+ std::uint64_t i;
203+ static void *operator new (size_t s) { py::print (" C new" , s); return ::operator new (s); }
204+ static void *operator new (size_t s, void *ptr) { py::print (" C placement-new" , s); return ptr; }
205+ static void operator delete (void *p, size_t s) { py::print (" C delete" , s); return ::operator delete (p); }
206+ virtual ~AliasedHasOpNewDelSize () = default ;
207+ };
208+ struct PyAliasedHasOpNewDelSize : AliasedHasOpNewDelSize {
209+ PyAliasedHasOpNewDelSize () = default ;
210+ PyAliasedHasOpNewDelSize (int ) { }
211+ std::uint64_t j;
212+ };
213+ struct HasOpNewDelBoth {
214+ std::uint32_t i[8 ];
215+ static void *operator new (size_t s) { py::print (" D new" , s); return ::operator new (s); }
216+ static void *operator new (size_t s, void *ptr) { py::print (" D placement-new" , s); return ptr; }
217+ static void operator delete (void *p) { py::print (" D delete" ); return ::operator delete (p); }
218+ static void operator delete (void *p, size_t s) { py::print (" D wrong delete" , s); return ::operator delete (p); }
219+ };
220+ py::class_<HasOpNewDel>(m, " HasOpNewDel" ).def (py::init<>());
221+ py::class_<HasOpNewDelSize>(m, " HasOpNewDelSize" ).def (py::init<>());
222+ py::class_<HasOpNewDelBoth>(m, " HasOpNewDelBoth" ).def (py::init<>());
223+ py::class_<AliasedHasOpNewDelSize, PyAliasedHasOpNewDelSize> aliased (m, " AliasedHasOpNewDelSize" );
224+ aliased.def (py::init<>());
225+ aliased.attr (" size_noalias" ) = py::int_ (sizeof (AliasedHasOpNewDelSize));
226+ aliased.attr (" size_alias" ) = py::int_ (sizeof (PyAliasedHasOpNewDelSize));
187227}
188228
189229template <int N> class BreaksBase {};
0 commit comments