Commit 7c2461ee by Wenzel Jakob

resolve issue involving inheritance + def_static + override (fixes #511)

parent 405f6d1d
...@@ -260,7 +260,7 @@ protected: ...@@ -260,7 +260,7 @@ protected:
chain = (detail::function_record *) rec_capsule; chain = (detail::function_record *) rec_capsule;
/* Never append a method to an overload chain of a parent class; /* Never append a method to an overload chain of a parent class;
instead, hide the parent's overloads in this case */ instead, hide the parent's overloads in this case */
if (chain->class_ != rec->class_) if (chain->scope != rec->scope)
chain = nullptr; chain = nullptr;
} }
// Don't trigger for things like the default __init__, which are wrapper_descriptors that we are intentionally replacing // Don't trigger for things like the default __init__, which are wrapper_descriptors that we are intentionally replacing
......
...@@ -351,6 +351,26 @@ void init_issues(py::module &m) { ...@@ -351,6 +351,26 @@ void init_issues(py::module &m) {
/// Issue #484: number conversion generates unhandled exceptions /// Issue #484: number conversion generates unhandled exceptions
m2.def("test_complex", [](float x) { py::print("{}"_s.format(x)); }); m2.def("test_complex", [](float x) { py::print("{}"_s.format(x)); });
m2.def("test_complex", [](std::complex<float> x) { py::print("({}, {})"_s.format(x.real(), x.imag())); }); m2.def("test_complex", [](std::complex<float> x) { py::print("({}, {})"_s.format(x.real(), x.imag())); });
/// Issue #511: problem with inheritance + overwritten def_static
struct MyBase {
static std::unique_ptr<MyBase> make() {
return std::unique_ptr<MyBase>(new MyBase());
}
};
struct MyDerived : MyBase {
static std::unique_ptr<MyDerived> make() {
return std::unique_ptr<MyDerived>(new MyDerived());
}
};
py::class_<MyBase>(m2, "MyBase")
.def_static("make", &MyBase::make);
py::class_<MyDerived, MyBase>(m2, "MyDerived")
.def_static("make", &MyDerived::make)
.def_static("make2", &MyDerived::make);
} }
// MSVC workaround: trying to use a lambda here crashes MSCV // MSVC workaround: trying to use a lambda here crashes MSCV
......
...@@ -237,3 +237,15 @@ def test_complex_cast(capture): ...@@ -237,3 +237,15 @@ def test_complex_cast(capture):
1.0 1.0
(0.0, 2.0) (0.0, 2.0)
""" """
def test_inheritance_override_def_static():
from pybind11_tests.issues import MyBase, MyDerived
b = MyBase.make()
d1 = MyDerived.make2()
d2 = MyDerived.make()
assert isinstance(b, MyBase)
assert isinstance(d1, MyDerived)
assert isinstance(d2, MyDerived)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment