xref: /llvm-project/llvm/unittests/Support/ExtensibleRTTITest.cpp (revision 52328dafda13711653fd15aa4db34db350471a1f)
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>(D);
70   (void)cast<MyBaseType>(BD);
71   (void)cast<MyDerivedType>(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