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
14using namespace llvm;
15
16namespace {
17
18class MyBaseType : public RTTIExtends<MyBaseType, RTTIRoot> {
19public:
20 static char ID;
21};
22
23class MyDerivedType : public RTTIExtends<MyDerivedType, MyBaseType> {
24public:
25 static char ID;
26};
27
28class MyOtherDerivedType : public RTTIExtends<MyOtherDerivedType, MyBaseType> {
29public:
30 static char ID;
31};
32
33class MyDeeperDerivedType
34 : public RTTIExtends<MyDeeperDerivedType, MyDerivedType> {
35public:
36 static char ID;
37};
38
39char MyBaseType::ID = 0;
40char MyDerivedType::ID = 0;
41char MyOtherDerivedType::ID = 0;
42char MyDeeperDerivedType::ID = 0;
43
44TEST(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
65TEST(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
74TEST(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

source code of llvm/unittests/Support/ExtensibleRTTITest.cpp