Skip to content

Commit 591a999

Browse files
authored
Merge pull request #409 from jagerman/dynamic-cast-test
Added a test to detect invalid RTTI caching
2 parents f226838 + 0e48977 commit 591a999

File tree

2 files changed

+14
-1
lines changed

2 files changed

+14
-1
lines changed

tests/test_inheritance.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,5 +77,10 @@ test_initializer inheritance([](py::module &m) {
7777

7878
m.def("return_class_1", []() -> BaseClass* { return new DerivedClass1(); });
7979
m.def("return_class_2", []() -> BaseClass* { return new DerivedClass2(); });
80+
m.def("return_class_n", [](int n) -> BaseClass* {
81+
if (n == 1) return new DerivedClass1();
82+
if (n == 2) return new DerivedClass2();
83+
return new BaseClass();
84+
});
8085
m.def("return_none", []() -> BaseClass* { return nullptr; });
8186
});

tests/test_inheritance.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,16 @@ def test_inheritance(msg):
3131

3232

3333
def test_automatic_upcasting():
34-
from pybind11_tests import return_class_1, return_class_2, return_none
34+
from pybind11_tests import return_class_1, return_class_2, return_class_n, return_none
3535

3636
assert type(return_class_1()).__name__ == "DerivedClass1"
3737
assert type(return_class_2()).__name__ == "DerivedClass2"
3838
assert type(return_none()).__name__ == "NoneType"
39+
# Repeat these a few times in a random order to ensure no invalid caching is applied
40+
assert type(return_class_n(1)).__name__ == "DerivedClass1"
41+
assert type(return_class_n(2)).__name__ == "DerivedClass2"
42+
assert type(return_class_n(0)).__name__ == "BaseClass"
43+
assert type(return_class_n(2)).__name__ == "DerivedClass2"
44+
assert type(return_class_n(2)).__name__ == "DerivedClass2"
45+
assert type(return_class_n(0)).__name__ == "BaseClass"
46+
assert type(return_class_n(1)).__name__ == "DerivedClass1"

0 commit comments

Comments
 (0)