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
TEST(ExtensibleRTTI,isa)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
TEST(ExtensibleRTTI,cast)65 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);
72 }
73
TEST(ExtensibleRTTI,dyn_cast)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