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