@@ -36,15 +36,24 @@ class MyDeeperDerivedType
36
36
static char ID;
37
37
};
38
38
39
+ class MyMultipleInheritanceType
40
+ : public RTTIExtends<MyMultipleInheritanceType,
41
+ MyDerivedType, MyOtherDerivedType> {
42
+ public:
43
+ static char ID;
44
+ };
45
+
39
46
char MyBaseType::ID = 0 ;
40
47
char MyDerivedType::ID = 0 ;
41
48
char MyOtherDerivedType::ID = 0 ;
42
49
char MyDeeperDerivedType::ID = 0 ;
50
+ char MyMultipleInheritanceType::ID = 0 ;
43
51
44
52
TEST (ExtensibleRTTI, isa) {
45
53
MyBaseType B;
46
54
MyDerivedType D;
47
55
MyDeeperDerivedType DD;
56
+ MyMultipleInheritanceType MI;
48
57
49
58
EXPECT_TRUE (isa<MyBaseType>(B));
50
59
EXPECT_FALSE (isa<MyDerivedType>(B));
@@ -60,26 +69,53 @@ TEST(ExtensibleRTTI, isa) {
60
69
EXPECT_TRUE (isa<MyDerivedType>(DD));
61
70
EXPECT_FALSE (isa<MyOtherDerivedType>(DD));
62
71
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));
63
78
}
64
79
65
80
TEST (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);
72
90
}
73
91
74
92
TEST (ExtensibleRTTI, dyn_cast) {
75
- MyBaseType B;
76
- MyDerivedType D;
93
+ MyMultipleInheritanceType MI;
94
+ MyDerivedType &D = MI;
95
+ MyOtherDerivedType &OD = MI;
77
96
MyBaseType &BD = D;
97
+ MyBaseType &BOD = OD;
78
98
79
- EXPECT_EQ (dyn_cast<MyDerivedType>(&B), nullptr );
80
- EXPECT_EQ (dyn_cast<MyDerivedType>(&D), &D);
81
99
EXPECT_EQ (dyn_cast<MyBaseType>(&BD), &BD);
82
100
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);
83
119
}
84
120
85
121
} // namespace
0 commit comments