Casting.cpp revision e8950977a5cf929ab15b6c5f7265a029500d9a7d
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/raw_ostream.h" 11#include "llvm/Support/Debug.h" 12//#define DEBUG_CAST_OPERATORS 13#include "llvm/Support/Casting.h" 14 15#include "gtest/gtest.h" 16#include <cstdlib> 17 18 19namespace llvm { 20 21// set up two example classes 22// with conversion facility 23// 24struct bar { 25 bar() {} 26 //struct foo *baz(); 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 45/*foo *bar::baz() { 46 return cast<foo>(this); 47}*/ 48 49 50bar *fub(); 51} // End llvm namespace 52 53using namespace llvm; 54 55namespace { 56 57const foo *null_foo = NULL; 58 59extern bar &B1; 60extern const bar *B2; 61// test various configurations of const 62const bar &B3 = B1; 63const bar *const B4 = B2; 64 65TEST(CastingTest, isa) { 66 EXPECT_TRUE(isa<foo>(B1)); 67 EXPECT_TRUE(isa<foo>(B2)); 68 EXPECT_TRUE(isa<foo>(B3)); 69 EXPECT_TRUE(isa<foo>(B4)); 70} 71 72TEST(CastingTest, cast) { 73 foo &F1 = cast<foo>(B1); 74 EXPECT_NE(&F1, null_foo); 75 const foo *F3 = cast<foo>(B2); 76 EXPECT_NE(F3, null_foo); 77 const foo *F4 = cast<foo>(B2); 78 EXPECT_NE(F4, null_foo); 79 const foo &F5 = cast<foo>(B3); 80 EXPECT_NE(&F5, null_foo); 81 const foo *F6 = cast<foo>(B4); 82 EXPECT_NE(F6, null_foo); 83 foo *F7 = cast<foo>(fub()); 84 EXPECT_EQ(F7, null_foo); 85 86/* foo *F8 = B1.baz(); 87 EXPECT_NE(F8, null_foo);*/ 88} 89 90TEST(CastingTest, cast_or_null) { 91 const foo *F11 = cast_or_null<foo>(B2); 92 EXPECT_NE(F11, null_foo); 93 const foo *F12 = cast_or_null<foo>(B2); 94 EXPECT_NE(F12, null_foo); 95 const foo *F13 = cast_or_null<foo>(B4); 96 EXPECT_NE(F13, null_foo); 97 const foo *F14 = cast_or_null<foo>(fub()); // Shouldn't print. 98 EXPECT_EQ(F14, null_foo); 99} 100 101// These lines are errors... 102//foo *F20 = cast<foo>(B2); // Yields const foo* 103//foo &F21 = cast<foo>(B3); // Yields const foo& 104//foo *F22 = cast<foo>(B4); // Yields const foo* 105//foo &F23 = cast_or_null<foo>(B1); 106//const foo &F24 = cast_or_null<foo>(B3); 107 108 109bar B; 110bar &B1 = B; 111const bar *B2 = &B; 112} // anonymous namespace 113 114bar *llvm::fub() { return 0; } 115