brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.8 KiB · 8b0ff89 Raw
144 lines · cpp
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-exception6//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 MyDeeperDerivedType34    : public RTTIExtends<MyDeeperDerivedType, MyDerivedType> {35public:36  static char ID;37};38 39class MyMultipleInheritanceType40    : public RTTIExtends<MyMultipleInheritanceType, MyDerivedType,41                         MyOtherDerivedType> {42public:43  static char ID;44};45 46class MyTypeWithConstructor47    : public RTTIExtends<MyTypeWithConstructor, MyBaseType> {48public:49  static char ID;50 51  MyTypeWithConstructor(int) {}52};53 54class MyDerivedTypeWithConstructor55    : public RTTIExtends<MyDerivedTypeWithConstructor, MyTypeWithConstructor> {56public:57  static char ID;58 59  MyDerivedTypeWithConstructor(int x) : RTTIExtends(x) {}60};61 62char MyBaseType::ID = 0;63char MyDerivedType::ID = 0;64char MyOtherDerivedType::ID = 0;65char MyDeeperDerivedType::ID = 0;66char MyMultipleInheritanceType::ID = 0;67char MyTypeWithConstructor::ID = 0;68char MyDerivedTypeWithConstructor::ID = 0;69 70TEST(ExtensibleRTTI, isa) {71  MyBaseType B;72  MyDerivedType D;73  MyDeeperDerivedType DD;74  MyMultipleInheritanceType MI;75 76  EXPECT_TRUE(isa<MyBaseType>(B));77  EXPECT_FALSE(isa<MyDerivedType>(B));78  EXPECT_FALSE(isa<MyOtherDerivedType>(B));79  EXPECT_FALSE(isa<MyDeeperDerivedType>(B));80 81  EXPECT_TRUE(isa<MyBaseType>(D));82  EXPECT_TRUE(isa<MyDerivedType>(D));83  EXPECT_FALSE(isa<MyOtherDerivedType>(D));84  EXPECT_FALSE(isa<MyDeeperDerivedType>(D));85 86  EXPECT_TRUE(isa<MyBaseType>(DD));87  EXPECT_TRUE(isa<MyDerivedType>(DD));88  EXPECT_FALSE(isa<MyOtherDerivedType>(DD));89  EXPECT_TRUE(isa<MyDeeperDerivedType>(DD));90 91  EXPECT_TRUE(isa<MyBaseType>(MI));92  EXPECT_TRUE(isa<MyDerivedType>(MI));93  EXPECT_TRUE(isa<MyOtherDerivedType>(MI));94  EXPECT_FALSE(isa<MyDeeperDerivedType>(MI));95  EXPECT_TRUE(isa<MyMultipleInheritanceType>(MI));96}97 98TEST(ExtensibleRTTI, cast) {99  MyMultipleInheritanceType MI;100  MyDerivedType &D = MI;101  MyOtherDerivedType &OD = MI;102  MyBaseType &B = D;103 104  EXPECT_EQ(&cast<MyBaseType>(D), &B);105  EXPECT_EQ(&cast<MyDerivedType>(MI), &D);106  EXPECT_EQ(&cast<MyOtherDerivedType>(MI), &OD);107  EXPECT_EQ(&cast<MyMultipleInheritanceType>(MI), &MI);108}109 110TEST(ExtensibleRTTI, dyn_cast) {111  MyMultipleInheritanceType MI;112  MyDerivedType &D = MI;113  MyOtherDerivedType &OD = MI;114  MyBaseType &BD = D;115  MyBaseType &BOD = OD;116 117  EXPECT_EQ(dyn_cast<MyBaseType>(&BD), &BD);118  EXPECT_EQ(dyn_cast<MyDerivedType>(&BD), &D);119 120  EXPECT_EQ(dyn_cast<MyBaseType>(&BOD), &BOD);121  EXPECT_EQ(dyn_cast<MyOtherDerivedType>(&BOD), &OD);122 123  EXPECT_EQ(dyn_cast<MyBaseType>(&D), &BD);124  EXPECT_EQ(dyn_cast<MyDerivedType>(&D), &D);125  EXPECT_EQ(dyn_cast<MyMultipleInheritanceType>(&D), &MI);126 127  EXPECT_EQ(dyn_cast<MyBaseType>(&OD), &BOD);128  EXPECT_EQ(dyn_cast<MyOtherDerivedType>(&OD), &OD);129  EXPECT_EQ(dyn_cast<MyMultipleInheritanceType>(&OD), &MI);130 131  EXPECT_EQ(dyn_cast<MyDerivedType>(&MI), &D);132  EXPECT_EQ(dyn_cast<MyMultipleInheritanceType>(&MI), &MI);133 134  EXPECT_EQ(dyn_cast<MyDerivedType>(&MI), &D);135  EXPECT_EQ(dyn_cast<MyOtherDerivedType>(&MI), &OD);136  EXPECT_EQ(dyn_cast<MyMultipleInheritanceType>(&MI), &MI);137}138 139TEST(ExtensibleRTTI, multiple_inheritance_constructor) {140  MyDerivedTypeWithConstructor V(42);141}142 143} // namespace144