diff --git a/tests/test_smart_ptr.cpp b/tests/test_smart_ptr.cpp index 2a51de9304..a301ef2975 100644 --- a/tests/test_smart_ptr.cpp +++ b/tests/test_smart_ptr.cpp @@ -404,4 +404,26 @@ TEST_SUBMODULE(smart_ptr, m) { py::class_(m, "UniquePtrDerived") .def(py::init()) .def("name", &UniquePtrDerived::name); + + class FirstT {}; + py::class_(m, "FirstT") + .def(py::init()); + class SecondT {}; + py::class_(m, "SecondT") + .def(py::init()); + + m.def("unique_ptr_overload", + [](std::unique_ptr obj, FirstT) { + py::dict out; + out["obj"] = py::cast(std::move(obj)); + out["overload"] = 1; + return out; + }); + m.def("unique_ptr_overload", + [](std::unique_ptr obj, SecondT) { + py::dict out; + out["obj"] = py::cast(std::move(obj)); + out["overload"] = 2; + return out; + }); } diff --git a/tests/test_smart_ptr.py b/tests/test_smart_ptr.py index 9e7f618cf3..a27810f326 100644 --- a/tests/test_smart_ptr.py +++ b/tests/test_smart_ptr.py @@ -328,3 +328,14 @@ def test_unique_ptr_derived(): assert obj.value() == 1 assert obj.name() == "a" del obj + + +def test_unique_ptr_overload_fail(): + obj = m.UniquePtrHeld(1) + # These overloads pass ownership back to Python. + out = m.unique_ptr_overload(obj, m.FirstT()) + assert out["obj"] is obj + assert out["overload"] == 1 + out = m.unique_ptr_overload(obj, m.SecondT()) + assert out["obj"] is obj + assert out["overload"] == 2