1 | //===------ unittests/ExtensibleRTTITest.cpp - Extensible RTTI Tests ------===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #include "llvm/Support/ExtensibleRTTI.h" |
10 | #include "llvm/Support/Casting.h" |
11 | |
12 | #include "gtest/gtest.h" |
13 | |
14 | using namespace llvm; |
15 | |
16 | namespace { |
17 | |
18 | class MyBaseType : public RTTIExtends<MyBaseType, RTTIRoot> { |
19 | public: |
20 | static char ID; |
21 | }; |
22 | |
23 | class MyDerivedType : public RTTIExtends<MyDerivedType, MyBaseType> { |
24 | public: |
25 | static char ID; |
26 | }; |
27 | |
28 | class MyOtherDerivedType : public RTTIExtends<MyOtherDerivedType, MyBaseType> { |
29 | public: |
30 | static char ID; |
31 | }; |
32 | |
33 | class MyDeeperDerivedType |
34 | : public RTTIExtends<MyDeeperDerivedType, MyDerivedType> { |
35 | public: |
36 | static char ID; |
37 | }; |
38 | |
39 | char MyBaseType::ID = 0; |
40 | char MyDerivedType::ID = 0; |
41 | char MyOtherDerivedType::ID = 0; |
42 | char MyDeeperDerivedType::ID = 0; |
43 | |
44 | TEST(ExtensibleRTTI, isa) { |
45 | MyBaseType B; |
46 | MyDerivedType D; |
47 | MyDeeperDerivedType DD; |
48 | |
49 | EXPECT_TRUE(isa<MyBaseType>(B)); |
50 | EXPECT_FALSE(isa<MyDerivedType>(B)); |
51 | EXPECT_FALSE(isa<MyOtherDerivedType>(B)); |
52 | EXPECT_FALSE(isa<MyDeeperDerivedType>(B)); |
53 | |
54 | EXPECT_TRUE(isa<MyBaseType>(D)); |
55 | EXPECT_TRUE(isa<MyDerivedType>(D)); |
56 | EXPECT_FALSE(isa<MyOtherDerivedType>(D)); |
57 | EXPECT_FALSE(isa<MyDeeperDerivedType>(D)); |
58 | |
59 | EXPECT_TRUE(isa<MyBaseType>(DD)); |
60 | EXPECT_TRUE(isa<MyDerivedType>(DD)); |
61 | EXPECT_FALSE(isa<MyOtherDerivedType>(DD)); |
62 | EXPECT_TRUE(isa<MyDeeperDerivedType>(DD)); |
63 | } |
64 | |
65 | TEST(ExtensibleRTTI, cast) { |
66 | MyDerivedType D; |
67 | MyBaseType &BD = D; |
68 | |
69 | (void)cast<MyBaseType>(Val&: D); |
70 | (void)cast<MyBaseType>(Val&: BD); |
71 | (void)cast<MyDerivedType>(Val&: BD); |
72 | } |
73 | |
74 | TEST(ExtensibleRTTI, dyn_cast) { |
75 | MyBaseType B; |
76 | MyDerivedType D; |
77 | MyBaseType &BD = D; |
78 | |
79 | EXPECT_EQ(dyn_cast<MyDerivedType>(&B), nullptr); |
80 | EXPECT_EQ(dyn_cast<MyDerivedType>(&D), &D); |
81 | EXPECT_EQ(dyn_cast<MyBaseType>(&BD), &BD); |
82 | EXPECT_EQ(dyn_cast<MyDerivedType>(&BD), &D); |
83 | } |
84 | |
85 | } // namespace |
86 | |