mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-22 13:15:12 +00:00
Report type names in return value policy-related cast exceptions (#1965)
This commit is contained in:
parent
c27a6e1378
commit
bdf6a5e870
@ -533,9 +533,17 @@ public:
|
|||||||
case return_value_policy::copy:
|
case return_value_policy::copy:
|
||||||
if (copy_constructor)
|
if (copy_constructor)
|
||||||
valueptr = copy_constructor(src);
|
valueptr = copy_constructor(src);
|
||||||
else
|
else {
|
||||||
throw cast_error("return_value_policy = copy, but the "
|
#if defined(NDEBUG)
|
||||||
"object is non-copyable!");
|
throw cast_error("return_value_policy = copy, but type is "
|
||||||
|
"non-copyable! (compile in debug mode for details)");
|
||||||
|
#else
|
||||||
|
std::string type_name(tinfo->cpptype->name());
|
||||||
|
detail::clean_type_id(type_name);
|
||||||
|
throw cast_error("return_value_policy = copy, but type " +
|
||||||
|
type_name + " is non-copyable!");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
wrapper->owned = true;
|
wrapper->owned = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -544,9 +552,18 @@ public:
|
|||||||
valueptr = move_constructor(src);
|
valueptr = move_constructor(src);
|
||||||
else if (copy_constructor)
|
else if (copy_constructor)
|
||||||
valueptr = copy_constructor(src);
|
valueptr = copy_constructor(src);
|
||||||
else
|
else {
|
||||||
throw cast_error("return_value_policy = move, but the "
|
#if defined(NDEBUG)
|
||||||
"object is neither movable nor copyable!");
|
throw cast_error("return_value_policy = move, but type is neither "
|
||||||
|
"movable nor copyable! "
|
||||||
|
"(compile in debug mode for details)");
|
||||||
|
#else
|
||||||
|
std::string type_name(tinfo->cpptype->name());
|
||||||
|
detail::clean_type_id(type_name);
|
||||||
|
throw cast_error("return_value_policy = move, but type " +
|
||||||
|
type_name + " is neither movable nor copyable!");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
wrapper->owned = true;
|
wrapper->owned = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -5,13 +5,13 @@ from pybind11_tests import copy_move_policies as m
|
|||||||
def test_lacking_copy_ctor():
|
def test_lacking_copy_ctor():
|
||||||
with pytest.raises(RuntimeError) as excinfo:
|
with pytest.raises(RuntimeError) as excinfo:
|
||||||
m.lacking_copy_ctor.get_one()
|
m.lacking_copy_ctor.get_one()
|
||||||
assert "the object is non-copyable!" in str(excinfo.value)
|
assert "is non-copyable!" in str(excinfo.value)
|
||||||
|
|
||||||
|
|
||||||
def test_lacking_move_ctor():
|
def test_lacking_move_ctor():
|
||||||
with pytest.raises(RuntimeError) as excinfo:
|
with pytest.raises(RuntimeError) as excinfo:
|
||||||
m.lacking_move_ctor.get_one()
|
m.lacking_move_ctor.get_one()
|
||||||
assert "the object is neither movable nor copyable!" in str(excinfo.value)
|
assert "is neither movable nor copyable!" in str(excinfo.value)
|
||||||
|
|
||||||
|
|
||||||
def test_move_and_copy_casts():
|
def test_move_and_copy_casts():
|
||||||
@ -98,7 +98,7 @@ def test_private_op_new():
|
|||||||
|
|
||||||
with pytest.raises(RuntimeError) as excinfo:
|
with pytest.raises(RuntimeError) as excinfo:
|
||||||
m.private_op_new_value()
|
m.private_op_new_value()
|
||||||
assert "the object is neither movable nor copyable" in str(excinfo.value)
|
assert "is neither movable nor copyable" in str(excinfo.value)
|
||||||
|
|
||||||
assert m.private_op_new_reference().value == 1
|
assert m.private_op_new_reference().value == 1
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user