From 7a74bfede7e243e41069778a7d08a6f481fb0839 Mon Sep 17 00:00:00 2001 From: "Ralf W. Grosse-Kunstleve" Date: Tue, 1 Jun 2021 13:17:05 -0700 Subject: [PATCH] Restoring init_holder overload for std::enable_shared_from_this and original tests/test_smart_ptr.py. --- include/pybind11/pybind11.h | 2 -- tests/test_smart_ptr.py | 16 +++++----------- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/include/pybind11/pybind11.h b/include/pybind11/pybind11.h index 4404a0927..432e28695 100644 --- a/include/pybind11/pybind11.h +++ b/include/pybind11/pybind11.h @@ -1577,7 +1577,6 @@ private: } // clang-format off -#ifdef JUNK /// Initialize holder object, variant 1: object derives from enable_shared_from_this template static void init_holder(detail::instance *inst, detail::value_and_holder &v_h, @@ -1595,7 +1594,6 @@ private: v_h.set_holder_constructed(); } } -#endif static void init_holder_from_existing(const detail::value_and_holder &v_h, const holder_type *holder_ptr, std::true_type /*is_copy_constructible*/) { diff --git a/tests/test_smart_ptr.py b/tests/test_smart_ptr.py index bea1a276f..d4e8e2e06 100644 --- a/tests/test_smart_ptr.py +++ b/tests/test_smart_ptr.py @@ -205,11 +205,9 @@ def test_shared_ptr_from_this_and_references(): ref = s.ref # init_holder_helper(holder_ptr=false, owned=false, bad_wp=false) assert stats.alive() == 2 assert s.set_ref(ref) - # assert s.set_holder( - # ref - # ) # std::enable_shared_from_this can create a holder from a reference - # RuntimeError: Unable to cast from non-held to held instance (T& to Holder) of type - # 'std::shared_ptr<(anonymous namespace)::SharedFromThisRef::B>'' + assert s.set_holder( + ref + ) # std::enable_shared_from_this can create a holder from a reference bad_wp = s.bad_wp # init_holder_helper(holder_ptr=false, owned=false, bad_wp=true) assert stats.alive() == 2 @@ -228,18 +226,14 @@ def test_shared_ptr_from_this_and_references(): ) # init_holder_helper(holder_ptr=true, owned=false, bad_wp=false) assert stats.alive() == 3 assert s.set_ref(holder_ref) - # assert s.set_holder(holder_ref) - # RuntimeError: Unable to cast from non-held to held instance (T& to Holder) of type - # 'std::shared_ptr<(anonymous namespace)::SharedFromThisRef::B>'' + assert s.set_holder(holder_ref) holder_copy = ( s.holder_copy ) # init_holder_helper(holder_ptr=true, owned=true, bad_wp=false) assert stats.alive() == 3 assert s.set_ref(holder_copy) - # assert s.set_holder(holder_copy) - # RuntimeError: Unable to cast from non-held to held instance (T& to Holder) of type - # 'std::shared_ptr<(anonymous namespace)::SharedFromThisRef::B>'' + assert s.set_holder(holder_copy) del ref, bad_wp, copy, holder_ref, holder_copy, s assert stats.alive() == 0