Casting.cpp revision e8950977a5cf929ab15b6c5f7265a029500d9a7d
1ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif//===---------- llvm/unittest/Support/Casting.cpp - Casting tests --------===// 2ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif// 3ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif// The LLVM Compiler Infrastructure 4ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif// 5ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif// This file is distributed under the University of Illinois Open Source 6ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif// License. See LICENSE.TXT for details. 7ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif// 8ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif//===----------------------------------------------------------------------===// 9ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif 10ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif#include "llvm/Support/raw_ostream.h" 11ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif#include "llvm/Support/Debug.h" 12e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif//#define DEBUG_CAST_OPERATORS 13ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif#include "llvm/Support/Casting.h" 14ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif 15ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif#include "gtest/gtest.h" 16ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif#include <cstdlib> 17ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif 18e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 19e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greifnamespace llvm { 20e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 21e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif// set up two example classes 22e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif// with conversion facility 23e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif// 24e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greifstruct bar { 25e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif bar() {} 26e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif //struct foo *baz(); 27e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greifprivate: 28e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif bar(const bar &); 29e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif}; 30e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greifstruct foo { 31e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif void ext() const; 32e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif /* static bool classof(const bar *X) { 33e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif cerr << "Classof: " << X << "\n"; 34e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif return true; 35e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif }*/ 36e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif}; 37e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 38e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greiftemplate <> struct isa_impl<foo,bar> { 39e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif static inline bool doit(const bar &Val) { 40e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif dbgs() << "Classof: " << &Val << "\n"; 41e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif return true; 42e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif } 43e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif}; 44e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 45e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif/*foo *bar::baz() { 46e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif return cast<foo>(this); 47e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif}*/ 48e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 49e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 50e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greifbar *fub(); 51e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif} // End llvm namespace 52e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 53ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greifusing namespace llvm; 54ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif 55ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greifnamespace { 56ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif 5708993c03abed359171d12b50ab38da0ac331cfb7Gabor Greifconst foo *null_foo = NULL; 5808993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif 59ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greifextern bar &B1; 60ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greifextern const bar *B2; 6108993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif// test various configurations of const 6208993c03abed359171d12b50ab38da0ac331cfb7Gabor Greifconst bar &B3 = B1; 6308993c03abed359171d12b50ab38da0ac331cfb7Gabor Greifconst bar *const B4 = B2; 64ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif 65af8e2ef649b90e88f9d595a638279e3bc4892845Gabor GreifTEST(CastingTest, isa) { 66ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif EXPECT_TRUE(isa<foo>(B1)); 67af8e2ef649b90e88f9d595a638279e3bc4892845Gabor Greif EXPECT_TRUE(isa<foo>(B2)); 68af8e2ef649b90e88f9d595a638279e3bc4892845Gabor Greif EXPECT_TRUE(isa<foo>(B3)); 69af8e2ef649b90e88f9d595a638279e3bc4892845Gabor Greif EXPECT_TRUE(isa<foo>(B4)); 70ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif} 71ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif 7208993c03abed359171d12b50ab38da0ac331cfb7Gabor GreifTEST(CastingTest, cast) { 7308993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif foo &F1 = cast<foo>(B1); 7408993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif EXPECT_NE(&F1, null_foo); 7508993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif const foo *F3 = cast<foo>(B2); 7608993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif EXPECT_NE(F3, null_foo); 7708993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif const foo *F4 = cast<foo>(B2); 7808993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif EXPECT_NE(F4, null_foo); 79e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif const foo &F5 = cast<foo>(B3); 80e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif EXPECT_NE(&F5, null_foo); 81e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif const foo *F6 = cast<foo>(B4); 82e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif EXPECT_NE(F6, null_foo); 83e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif foo *F7 = cast<foo>(fub()); 84e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif EXPECT_EQ(F7, null_foo); 85e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 86e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif/* foo *F8 = B1.baz(); 87e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif EXPECT_NE(F8, null_foo);*/ 8808993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif} 8908993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif 9008993c03abed359171d12b50ab38da0ac331cfb7Gabor GreifTEST(CastingTest, cast_or_null) { 9108993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif const foo *F11 = cast_or_null<foo>(B2); 9208993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif EXPECT_NE(F11, null_foo); 9308993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif const foo *F12 = cast_or_null<foo>(B2); 9408993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif EXPECT_NE(F12, null_foo); 9508993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif const foo *F13 = cast_or_null<foo>(B4); 9608993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif EXPECT_NE(F13, null_foo); 9708993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif const foo *F14 = cast_or_null<foo>(fub()); // Shouldn't print. 9808993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif EXPECT_EQ(F14, null_foo); 9908993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif} 10008993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif 101e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif// These lines are errors... 102e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif//foo *F20 = cast<foo>(B2); // Yields const foo* 103e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif//foo &F21 = cast<foo>(B3); // Yields const foo& 104e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif//foo *F22 = cast<foo>(B4); // Yields const foo* 105e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif//foo &F23 = cast_or_null<foo>(B1); 106e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif//const foo &F24 = cast_or_null<foo>(B3); 107e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 108e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 109ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greifbar B; 110ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greifbar &B1 = B; 111ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greifconst bar *B2 = &B; 112ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif} // anonymous namespace 113e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 114e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greifbar *llvm::fub() { return 0; } 115