Fix type caster for heap reference types
Need to use the intrinsic type, not the raw type.
Fixes #392.
diff --git a/tests/test_issues.cpp b/tests/test_issues.cpp
index 7c10643..66ff79d 100644
--- a/tests/test_issues.cpp
+++ b/tests/test_issues.cpp
@@ -191,6 +191,35 @@
py::class_<MoveIssue2>(m2, "MoveIssue2").def(py::init<int>()).def_readwrite("value", &MoveIssue2::v);
m2.def("get_moveissue1", [](int i) -> MoveIssue1 * { return new MoveIssue1(i); }, py::return_value_policy::move);
m2.def("get_moveissue2", [](int i) { return MoveIssue2(i); }, py::return_value_policy::move);
+
+ // Issue 392: overridding reference-returning functions
+ class OverrideTest {
+ public:
+ struct A { int value = 99; };
+ int v;
+ A a;
+ explicit OverrideTest(int v) : v{v} {}
+ virtual int int_value() { return v; }
+ virtual int &int_ref() { return v; }
+ virtual A A_value() { return a; }
+ virtual A &A_ref() { return a; }
+ };
+ class PyOverrideTest : public OverrideTest {
+ public:
+ using OverrideTest::OverrideTest;
+ int int_value() override { PYBIND11_OVERLOAD(int, OverrideTest, int_value); }
+ int &int_ref() override { PYBIND11_OVERLOAD(int &, OverrideTest, int_ref); }
+ A A_value() override { PYBIND11_OVERLOAD(A, OverrideTest, A_value); }
+ A &A_ref() override { PYBIND11_OVERLOAD(A &, OverrideTest, A_ref); }
+ };
+ py::class_<OverrideTest::A>(m2, "OverrideTest_A")
+ .def_readwrite("value", &OverrideTest::A::value);
+ py::class_<OverrideTest, PyOverrideTest>(m2, "OverrideTest")
+ .def(py::init<int>())
+ .def("int_value", &OverrideTest::int_value)
+ .def("int_ref", &OverrideTest::int_ref)
+ .def("A_value", &OverrideTest::A_value)
+ .def("A_ref", &OverrideTest::A_ref);
}
// MSVC workaround: trying to use a lambda here crashes MSCV