Throw an exception when attempting to load an incompatible holder

Instead of a segfault. Fixes #751.

This covers the case of loading a custom holder from a default-holder
instance. Attempting to load one custom holder from a different custom
holder (i.e. not `std::unique_ptr`) yields undefined behavior, just as
#588 established for inheritance.
This commit is contained in:
Dean Moldovan
2017-03-20 21:53:24 +01:00
parent 0f5ec0a87e
commit cd3d1fc7df
3 changed files with 18 additions and 0 deletions

View File

@@ -211,3 +211,12 @@ def test_move_only_holder():
assert stats.alive() == 1
del a
assert stats.alive() == 0
def test_smart_ptr_from_default():
from pybind11_tests.smart_ptr import HeldByDefaultHolder
instance = HeldByDefaultHolder()
with pytest.raises(RuntimeError) as excinfo:
HeldByDefaultHolder.load_shared_ptr(instance)
assert "Unable to load a custom holder type from a default-holder instance" in str(excinfo)