@@ -36,15 +36,42 @@ class MyDeeperDerivedType
3636 static char ID;
3737};
3838
39+ class MyMultipleInheritanceType
40+ : public RTTIExtends<MyMultipleInheritanceType, MyDerivedType,
41+ MyOtherDerivedType> {
42+ public:
43+ static char ID;
44+ };
45+
46+ class MyTypeWithConstructor
47+ : public RTTIExtends<MyTypeWithConstructor, MyBaseType> {
48+ public:
49+ static char ID;
50+
51+ MyTypeWithConstructor (int ) {}
52+ };
53+
54+ class MyDerivedTypeWithConstructor
55+ : public RTTIExtends<MyDerivedTypeWithConstructor, MyTypeWithConstructor> {
56+ public:
57+ static char ID;
58+
59+ MyDerivedTypeWithConstructor (int x) : RTTIExtends(x) {}
60+ };
61+
3962char MyBaseType::ID = 0 ;
4063char MyDerivedType::ID = 0 ;
4164char MyOtherDerivedType::ID = 0 ;
4265char MyDeeperDerivedType::ID = 0 ;
66+ char MyMultipleInheritanceType::ID = 0 ;
67+ char MyTypeWithConstructor::ID = 0 ;
68+ char MyDerivedTypeWithConstructor::ID = 0 ;
4369
4470TEST (ExtensibleRTTI, isa) {
4571 MyBaseType B;
4672 MyDerivedType D;
4773 MyDeeperDerivedType DD;
74+ MyMultipleInheritanceType MI;
4875
4976 EXPECT_TRUE (isa<MyBaseType>(B));
5077 EXPECT_FALSE (isa<MyDerivedType>(B));
@@ -60,26 +87,57 @@ TEST(ExtensibleRTTI, isa) {
6087 EXPECT_TRUE (isa<MyDerivedType>(DD));
6188 EXPECT_FALSE (isa<MyOtherDerivedType>(DD));
6289 EXPECT_TRUE (isa<MyDeeperDerivedType>(DD));
90+
91+ EXPECT_TRUE (isa<MyBaseType>(MI));
92+ EXPECT_TRUE (isa<MyDerivedType>(MI));
93+ EXPECT_TRUE (isa<MyOtherDerivedType>(MI));
94+ EXPECT_FALSE (isa<MyDeeperDerivedType>(MI));
95+ EXPECT_TRUE (isa<MyMultipleInheritanceType>(MI));
6396}
6497
6598TEST (ExtensibleRTTI, cast) {
66- MyDerivedType D;
67- MyBaseType &BD = D;
68-
69- (void )cast<MyBaseType>(D);
70- (void )cast<MyBaseType>(BD);
71- (void )cast<MyDerivedType>(BD);
99+ MyMultipleInheritanceType MI;
100+ MyDerivedType &D = MI;
101+ MyOtherDerivedType &OD = MI;
102+ MyBaseType &B = D;
103+
104+ EXPECT_EQ (&cast<MyBaseType>(D), &B);
105+ EXPECT_EQ (&cast<MyDerivedType>(MI), &D);
106+ EXPECT_EQ (&cast<MyOtherDerivedType>(MI), &OD);
107+ EXPECT_EQ (&cast<MyMultipleInheritanceType>(MI), &MI);
72108}
73109
74110TEST (ExtensibleRTTI, dyn_cast) {
75- MyBaseType B;
76- MyDerivedType D;
111+ MyMultipleInheritanceType MI;
112+ MyDerivedType &D = MI;
113+ MyOtherDerivedType &OD = MI;
77114 MyBaseType &BD = D;
115+ MyBaseType &BOD = OD;
78116
79- EXPECT_EQ (dyn_cast<MyDerivedType>(&B), nullptr );
80- EXPECT_EQ (dyn_cast<MyDerivedType>(&D), &D);
81117 EXPECT_EQ (dyn_cast<MyBaseType>(&BD), &BD);
82118 EXPECT_EQ (dyn_cast<MyDerivedType>(&BD), &D);
119+
120+ EXPECT_EQ (dyn_cast<MyBaseType>(&BOD), &BOD);
121+ EXPECT_EQ (dyn_cast<MyOtherDerivedType>(&BOD), &OD);
122+
123+ EXPECT_EQ (dyn_cast<MyBaseType>(&D), &BD);
124+ EXPECT_EQ (dyn_cast<MyDerivedType>(&D), &D);
125+ EXPECT_EQ (dyn_cast<MyMultipleInheritanceType>(&D), &MI);
126+
127+ EXPECT_EQ (dyn_cast<MyBaseType>(&OD), &BOD);
128+ EXPECT_EQ (dyn_cast<MyOtherDerivedType>(&OD), &OD);
129+ EXPECT_EQ (dyn_cast<MyMultipleInheritanceType>(&OD), &MI);
130+
131+ EXPECT_EQ (dyn_cast<MyDerivedType>(&MI), &D);
132+ EXPECT_EQ (dyn_cast<MyMultipleInheritanceType>(&MI), &MI);
133+
134+ EXPECT_EQ (dyn_cast<MyDerivedType>(&MI), &D);
135+ EXPECT_EQ (dyn_cast<MyOtherDerivedType>(&MI), &OD);
136+ EXPECT_EQ (dyn_cast<MyMultipleInheritanceType>(&MI), &MI);
137+ }
138+
139+ TEST (ExtensibleRTTI, multiple_inheritance_constructor) {
140+ MyDerivedTypeWithConstructor V (42 );
83141}
84142
85143} // namespace
0 commit comments