Skip to content

Commit 4f90d85

Browse files
committed
Experiment: specify indirect bases
1 parent a2f95e1 commit 4f90d85

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

tests/test_python_multiple_inheritance.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,14 @@ struct CppDrvd : CppBase {
2626
int drvd_value;
2727
};
2828

29+
struct CppDrv2 : CppDrvd {
30+
explicit CppDrv2(int value) : CppDrvd(value), drv2_value(value * 5) {}
31+
int get_drv2_value() const { return drv2_value; }
32+
33+
private:
34+
int drv2_value;
35+
};
36+
2937
} // namespace test_python_multiple_inheritance
3038

3139
TEST_SUBMODULE(python_multiple_inheritance, m) {
@@ -42,4 +50,12 @@ TEST_SUBMODULE(python_multiple_inheritance, m) {
4250
.def("reset_drvd_value", &CppDrvd::reset_drvd_value)
4351
.def("get_base_value_from_drvd", &CppDrvd::get_base_value_from_drvd)
4452
.def("reset_base_value_from_drvd", &CppDrvd::reset_base_value_from_drvd);
53+
54+
#if 1 // This works.
55+
py::class_<CppDrv2, CppDrvd>(m, "CppDrv2")
56+
#else // Apparent undefined behavior.
57+
py::class_<CppDrv2, CppDrvd, CppBase>(m, "CppDrv2")
58+
#endif
59+
.def(py::init<int>())
60+
.def("get_drv2_value", &CppDrv2::get_drv2_value);
4561
}

tests/test_python_multiple_inheritance.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ class PPCC(PC, m.CppDrvd):
1212
pass
1313

1414

15+
class PPCC2(PC, m.CppDrv2):
16+
pass
17+
18+
1519
def test_PC():
1620
d = PC(11)
1721
assert d.get_base_value() == 11
@@ -33,3 +37,10 @@ def test_PPCC():
3337
d.reset_base_value_from_drvd(30)
3438
assert d.get_base_value() == 30
3539
assert d.get_base_value_from_drvd() == 30
40+
41+
42+
def test_PPCC2():
43+
d = PPCC2(13)
44+
assert d.get_drv2_value() == 65
45+
assert d.get_drvd_value() == 39
46+
assert d.get_base_value() == 13

0 commit comments

Comments
 (0)