Casting.cpp revision 46a35015f5268bf72150eb1b1517337e245e38e5
1//===---------- llvm/unittest/Support/Casting.cpp - Casting 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/Casting.h" 11#include "llvm/Support/Debug.h" 12#include "llvm/Support/raw_ostream.h" 13 14#include "gtest/gtest.h" 15#include <cstdlib> 16 17namespace llvm { 18 19// set up two example classes 20// with conversion facility 21// 22struct bar { 23 bar() {} 24 struct foo *baz(); 25 struct foo *caz(); 26 // struct foo *daz(); 27private: 28 bar(const bar &); 29}; 30struct foo { 31 void ext() const; 32 /* static bool classof(const bar *X) { 33 cerr << "Classof: " << X << "\n"; 34 return true; 35 }*/ 36}; 37 38template <> struct isa_impl<foo,bar> { 39 static inline bool doit(const bar &Val) { 40 dbgs() << "Classof: " << &Val << "\n"; 41 return true; 42 } 43}; 44 45foo *bar::baz() { 46 return cast<foo>(this); 47} 48 49foo *bar::caz() { 50 return cast_or_null<foo>(this); 51} 52 53 54/*foo *bar::daz() { 55 return dyn_cast<foo>(this); 56}*/ 57 58 59bar *fub(); 60} // End llvm namespace 61 62using namespace llvm; 63 64namespace { 65 66const foo *null_foo = NULL; 67 68extern bar &B1; 69extern const bar *B2; 70// test various configurations of const 71const bar &B3 = B1; 72const bar *const B4 = B2; 73 74TEST(CastingTest, isa) { 75 EXPECT_TRUE(isa<foo>(B1)); 76 EXPECT_TRUE(isa<foo>(B2)); 77 EXPECT_TRUE(isa<foo>(B3)); 78 EXPECT_TRUE(isa<foo>(B4)); 79} 80 81TEST(CastingTest, cast) { 82 foo &F1 = cast<foo>(B1); 83 EXPECT_NE(&F1, null_foo); 84 const foo *F3 = cast<foo>(B2); 85 EXPECT_NE(F3, null_foo); 86 const foo *F4 = cast<foo>(B2); 87 EXPECT_NE(F4, null_foo); 88 const foo &F5 = cast<foo>(B3); 89 EXPECT_NE(&F5, null_foo); 90 const foo *F6 = cast<foo>(B4); 91 EXPECT_NE(F6, null_foo); 92 foo *F7 = cast<foo>(fub()); 93 EXPECT_EQ(F7, null_foo); 94 foo *F8 = B1.baz(); 95 EXPECT_NE(F8, null_foo); 96} 97 98TEST(CastingTest, cast_or_null) { 99 const foo *F11 = cast_or_null<foo>(B2); 100 EXPECT_NE(F11, null_foo); 101 const foo *F12 = cast_or_null<foo>(B2); 102 EXPECT_NE(F12, null_foo); 103 const foo *F13 = cast_or_null<foo>(B4); 104 EXPECT_NE(F13, null_foo); 105 const foo *F14 = cast_or_null<foo>(fub()); // Shouldn't print. 106 EXPECT_EQ(F14, null_foo); 107 foo *F15 = B1.caz(); 108 EXPECT_NE(F15, null_foo); 109} 110 111TEST(CastingTest, dyn_cast) { 112 const foo *F1 = dyn_cast<foo>(B2); 113 EXPECT_NE(F1, null_foo); 114 const foo *F2 = dyn_cast<foo>(B2); 115 EXPECT_NE(F2, null_foo); 116 const foo *F3 = dyn_cast<foo>(B4); 117 EXPECT_NE(F3, null_foo); 118 foo *F4 = dyn_cast<foo>(fub()); 119 EXPECT_EQ(F4, null_foo); 120 // foo *F5 = B1.daz(); 121 // EXPECT_NE(F5, null_foo); 122} 123 124// These lines are errors... 125//foo *F20 = cast<foo>(B2); // Yields const foo* 126//foo &F21 = cast<foo>(B3); // Yields const foo& 127//foo *F22 = cast<foo>(B4); // Yields const foo* 128//foo &F23 = cast_or_null<foo>(B1); 129//const foo &F24 = cast_or_null<foo>(B3); 130 131 132bar B; 133bar &B1 = B; 134const bar *B2 = &B; 135} // anonymous namespace 136 137bar *llvm::fub() { return 0; } 138