diff --git a/test/polymorphism2.cpp b/test/polymorphism2.cpp index 14df0dbc..b5c773e0 100755 --- a/test/polymorphism2.cpp +++ b/test/polymorphism2.cpp @@ -55,9 +55,11 @@ struct ACallback : A, wrapper #else return f(); #endif - //else - return A::f(); + + return A::f(); } + + char const* default_f() { return this->A::f(); } }; struct B : A @@ -124,7 +126,7 @@ A* pass_a(A* x) { return x; } BOOST_PYTHON_MODULE_INIT(polymorphism2_ext) { class_("A") - .def("f", &A::f) + .def("f", &A::f, &ACallback::default_f) ; def("getBCppObj", getBCppObj, return_value_policy()); diff --git a/test/polymorphism2.py b/test/polymorphism2.py index 597cbe1b..01f6f2f2 100644 --- a/test/polymorphism2.py +++ b/test/polymorphism2.py @@ -46,6 +46,19 @@ class PolymorphTest(unittest.TestCase): self.failUnlessEqual ('X.f', x.f()) self.failUnlessEqual ('X.f', call_f(x)) + def test_self_default(self): + + class X(A): + def f(self): + return 'X.f() -> ' + A.f(self) + + x = X() + + self.failUnlessEqual ('X.f() -> A::f()', x.f()) + + # This one properly raises the "dangling reference" exception + # self.failUnlessEqual ('X.f() -> A::f()', call_f(x)) + def test_wrapper_downcast(self): a = pass_a(D()) self.failUnlessEqual('D::g()', a.g())