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