@@ -36,15 +36,24 @@ 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+
3946char MyBaseType::ID = 0 ;
4047char MyDerivedType::ID = 0 ;
4148char MyOtherDerivedType::ID = 0 ;
4249char MyDeeperDerivedType::ID = 0 ;
50+ char MyMultipleInheritanceType::ID = 0 ;
4351
4452TEST (ExtensibleRTTI, isa) {
4553 MyBaseType B;
4654 MyDerivedType D;
4755 MyDeeperDerivedType DD;
56+ MyMultipleInheritanceType MI;
4857
4958 EXPECT_TRUE (isa<MyBaseType>(B));
5059 EXPECT_FALSE (isa<MyDerivedType>(B));
@@ -60,26 +69,53 @@ TEST(ExtensibleRTTI, isa) {
6069 EXPECT_TRUE (isa<MyDerivedType>(DD));
6170 EXPECT_FALSE (isa<MyOtherDerivedType>(DD));
6271 EXPECT_TRUE (isa<MyDeeperDerivedType>(DD));
72+
73+ EXPECT_TRUE (isa<MyBaseType>(MI));
74+ EXPECT_TRUE (isa<MyDerivedType>(MI));
75+ EXPECT_TRUE (isa<MyOtherDerivedType>(MI));
76+ EXPECT_FALSE (isa<MyDeeperDerivedType>(MI));
77+ EXPECT_TRUE (isa<MyMultipleInheritanceType>(MI));
6378}
6479
6580TEST (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);
81+ MyMultipleInheritanceType MI;
82+ MyDerivedType &D = MI;
83+ MyOtherDerivedType &OD = MI;
84+ MyBaseType &B = D;
85+
86+ EXPECT_EQ (&cast<MyBaseType>(D), &B);
87+ EXPECT_EQ (&cast<MyDerivedType>(MI), &D);
88+ EXPECT_EQ (&cast<MyOtherDerivedType>(MI), &OD);
89+ EXPECT_EQ (&cast<MyMultipleInheritanceType>(MI), &MI);
7290}
7391
7492TEST (ExtensibleRTTI, dyn_cast) {
75- MyBaseType B;
76- MyDerivedType D;
93+ MyMultipleInheritanceType MI;
94+ MyDerivedType &D = MI;
95+ MyOtherDerivedType &OD = MI;
7796 MyBaseType &BD = D;
97+ MyBaseType &BOD = OD;
7898
79- EXPECT_EQ (dyn_cast<MyDerivedType>(&B), nullptr );
80- EXPECT_EQ (dyn_cast<MyDerivedType>(&D), &D);
8199 EXPECT_EQ (dyn_cast<MyBaseType>(&BD), &BD);
82100 EXPECT_EQ (dyn_cast<MyDerivedType>(&BD), &D);
101+
102+ EXPECT_EQ (dyn_cast<MyBaseType>(&BOD), &BOD);
103+ EXPECT_EQ (dyn_cast<MyOtherDerivedType>(&BOD), &OD);
104+
105+ EXPECT_EQ (dyn_cast<MyBaseType>(&D), &BD);
106+ EXPECT_EQ (dyn_cast<MyDerivedType>(&D), &D);
107+ EXPECT_EQ (dyn_cast<MyMultipleInheritanceType>(&D), &MI);
108+
109+ EXPECT_EQ (dyn_cast<MyBaseType>(&OD), &BOD);
110+ EXPECT_EQ (dyn_cast<MyOtherDerivedType>(&OD), &OD);
111+ EXPECT_EQ (dyn_cast<MyMultipleInheritanceType>(&OD), &MI);
112+
113+ EXPECT_EQ (dyn_cast<MyDerivedType>(&MI), &D);
114+ EXPECT_EQ (dyn_cast<MyMultipleInheritanceType>(&MI), &MI);
115+
116+ EXPECT_EQ (dyn_cast<MyDerivedType>(&MI), &D);
117+ EXPECT_EQ (dyn_cast<MyOtherDerivedType>(&MI), &OD);
118+ EXPECT_EQ (dyn_cast<MyMultipleInheritanceType>(&MI), &MI);
83119}
84120
85121} // namespace
0 commit comments