resolve issue involving inheritance + def_static + override (fixes #511)
diff --git a/include/pybind11/pybind11.h b/include/pybind11/pybind11.h
index 0079052..1221ba6 100644
--- a/include/pybind11/pybind11.h
+++ b/include/pybind11/pybind11.h
@@ -260,7 +260,7 @@
chain = (detail::function_record *) rec_capsule;
/* Never append a method to an overload chain of a parent class;
instead, hide the parent's overloads in this case */
- if (chain->class_ != rec->class_)
+ if (chain->scope != rec->scope)
chain = nullptr;
}
// Don't trigger for things like the default __init__, which are wrapper_descriptors that we are intentionally replacing
diff --git a/tests/test_issues.cpp b/tests/test_issues.cpp
index 084ea31..33f8a43 100644
--- a/tests/test_issues.cpp
+++ b/tests/test_issues.cpp
@@ -351,6 +351,26 @@
/// Issue #484: number conversion generates unhandled exceptions
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())); });
+
+ /// 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
diff --git a/tests/test_issues.py b/tests/test_issues.py
index a2cf530..1b29ceb 100644
--- a/tests/test_issues.py
+++ b/tests/test_issues.py
@@ -237,3 +237,15 @@
1.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)