//===------ unittests/ExtensibleRTTITest.cpp - Extensible RTTI Tests ------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "llvm/Support/ExtensibleRTTI.h" #include "llvm/Support/Casting.h" #include "gtest/gtest.h" using namespace llvm; namespace { class MyBaseType : public RTTIExtends { public: static char ID; }; class MyDerivedType : public RTTIExtends { public: static char ID; }; class MyOtherDerivedType : public RTTIExtends { public: static char ID; }; class MyDeeperDerivedType : public RTTIExtends { public: static char ID; }; class MyMultipleInheritanceType : public RTTIExtends { public: static char ID; }; class MyTypeWithConstructor : public RTTIExtends { public: static char ID; MyTypeWithConstructor(int) {} }; class MyDerivedTypeWithConstructor : public RTTIExtends { public: static char ID; MyDerivedTypeWithConstructor(int x) : RTTIExtends(x) {} }; char MyBaseType::ID = 0; char MyDerivedType::ID = 0; char MyOtherDerivedType::ID = 0; char MyDeeperDerivedType::ID = 0; char MyMultipleInheritanceType::ID = 0; char MyTypeWithConstructor::ID = 0; char MyDerivedTypeWithConstructor::ID = 0; TEST(ExtensibleRTTI, isa) { MyBaseType B; MyDerivedType D; MyDeeperDerivedType DD; MyMultipleInheritanceType MI; EXPECT_TRUE(isa(B)); EXPECT_FALSE(isa(B)); EXPECT_FALSE(isa(B)); EXPECT_FALSE(isa(B)); EXPECT_TRUE(isa(D)); EXPECT_TRUE(isa(D)); EXPECT_FALSE(isa(D)); EXPECT_FALSE(isa(D)); EXPECT_TRUE(isa(DD)); EXPECT_TRUE(isa(DD)); EXPECT_FALSE(isa(DD)); EXPECT_TRUE(isa(DD)); EXPECT_TRUE(isa(MI)); EXPECT_TRUE(isa(MI)); EXPECT_TRUE(isa(MI)); EXPECT_FALSE(isa(MI)); EXPECT_TRUE(isa(MI)); } TEST(ExtensibleRTTI, cast) { MyMultipleInheritanceType MI; MyDerivedType &D = MI; MyOtherDerivedType &OD = MI; MyBaseType &B = D; EXPECT_EQ(&cast(D), &B); EXPECT_EQ(&cast(MI), &D); EXPECT_EQ(&cast(MI), &OD); EXPECT_EQ(&cast(MI), &MI); } TEST(ExtensibleRTTI, dyn_cast) { MyMultipleInheritanceType MI; MyDerivedType &D = MI; MyOtherDerivedType &OD = MI; MyBaseType &BD = D; MyBaseType &BOD = OD; EXPECT_EQ(dyn_cast(&BD), &BD); EXPECT_EQ(dyn_cast(&BD), &D); EXPECT_EQ(dyn_cast(&BOD), &BOD); EXPECT_EQ(dyn_cast(&BOD), &OD); EXPECT_EQ(dyn_cast(&D), &BD); EXPECT_EQ(dyn_cast(&D), &D); EXPECT_EQ(dyn_cast(&D), &MI); EXPECT_EQ(dyn_cast(&OD), &BOD); EXPECT_EQ(dyn_cast(&OD), &OD); EXPECT_EQ(dyn_cast(&OD), &MI); EXPECT_EQ(dyn_cast(&MI), &D); EXPECT_EQ(dyn_cast(&MI), &MI); EXPECT_EQ(dyn_cast(&MI), &D); EXPECT_EQ(dyn_cast(&MI), &OD); EXPECT_EQ(dyn_cast(&MI), &MI); } TEST(ExtensibleRTTI, multiple_inheritance_constructor) { MyDerivedTypeWithConstructor V(42); } } // namespace