@@ -36,15 +36,42 @@ class MyDeeperDerivedType
36
36
static char ID;
37
37
};
38
38
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
+
39
62
char MyBaseType::ID = 0 ;
40
63
char MyDerivedType::ID = 0 ;
41
64
char MyOtherDerivedType::ID = 0 ;
42
65
char MyDeeperDerivedType::ID = 0 ;
66
+ char MyMultipleInheritanceType::ID = 0 ;
67
+ char MyTypeWithConstructor::ID = 0 ;
68
+ char MyDerivedTypeWithConstructor::ID = 0 ;
43
69
44
70
TEST (ExtensibleRTTI, isa) {
45
71
MyBaseType B;
46
72
MyDerivedType D;
47
73
MyDeeperDerivedType DD;
74
+ MyMultipleInheritanceType MI;
48
75
49
76
EXPECT_TRUE (isa<MyBaseType>(B));
50
77
EXPECT_FALSE (isa<MyDerivedType>(B));
@@ -60,26 +87,57 @@ TEST(ExtensibleRTTI, isa) {
60
87
EXPECT_TRUE (isa<MyDerivedType>(DD));
61
88
EXPECT_FALSE (isa<MyOtherDerivedType>(DD));
62
89
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));
63
96
}
64
97
65
98
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);
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);
72
108
}
73
109
74
110
TEST (ExtensibleRTTI, dyn_cast) {
75
- MyBaseType B;
76
- MyDerivedType D;
111
+ MyMultipleInheritanceType MI;
112
+ MyDerivedType &D = MI;
113
+ MyOtherDerivedType &OD = MI;
77
114
MyBaseType &BD = D;
115
+ MyBaseType &BOD = OD;
78
116
79
- EXPECT_EQ (dyn_cast<MyDerivedType>(&B), nullptr );
80
- EXPECT_EQ (dyn_cast<MyDerivedType>(&D), &D);
81
117
EXPECT_EQ (dyn_cast<MyBaseType>(&BD), &BD);
82
118
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 );
83
141
}
84
142
85
143
} // namespace
0 commit comments