Casting.cpp revision f06eb3719aef56a31fb5c56e5b086995aefafef5
1b3c90d96bd64c4b2b1b471b3c45bb119c526ca7bGabor 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/Casting.h" 11b3c90d96bd64c4b2b1b471b3c45bb119c526ca7bGabor Greif#include "llvm/Support/Debug.h" 12b3c90d96bd64c4b2b1b471b3c45bb119c526ca7bGabor Greif#include "llvm/Support/raw_ostream.h" 13ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif 14ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif#include "gtest/gtest.h" 15ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif#include <cstdlib> 16ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif 17e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greifnamespace llvm { 18e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 19e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif// set up two example classes 20e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif// with conversion facility 21e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif// 22e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greifstruct bar { 23e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif bar() {} 24d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif struct foo *baz(); 25d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif struct foo *caz(); 26f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif struct foo *daz(); 27f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif struct foo *naz(); 28e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greifprivate: 29e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif bar(const bar &); 30e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif}; 31e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greifstruct foo { 32e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif void ext() const; 33e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif /* static bool classof(const bar *X) { 34e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif cerr << "Classof: " << X << "\n"; 35e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif return true; 36e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif }*/ 37e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif}; 38e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 39f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greiftemplate <> struct isa_impl<foo, bar> { 40e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif static inline bool doit(const bar &Val) { 41e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif dbgs() << "Classof: " << &Val << "\n"; 42e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif return true; 43e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif } 44e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif}; 45e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 46d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greiffoo *bar::baz() { 47e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif return cast<foo>(this); 48d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif} 49d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif 50d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greiffoo *bar::caz() { 51d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif return cast_or_null<foo>(this); 52d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif} 53d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif 54f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greiffoo *bar::daz() { 55d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif return dyn_cast<foo>(this); 56f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif} 57f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif 58f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greiffoo *bar::naz() { 59f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif return dyn_cast_or_null<foo>(this); 60f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif} 61e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 62e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 63e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greifbar *fub(); 64e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif} // End llvm namespace 65e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 66ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greifusing namespace llvm; 67ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif 68ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greifnamespace { 69ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif 7008993c03abed359171d12b50ab38da0ac331cfb7Gabor Greifconst foo *null_foo = NULL; 7108993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif 72ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greifextern bar &B1; 73ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greifextern const bar *B2; 7408993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif// test various configurations of const 7508993c03abed359171d12b50ab38da0ac331cfb7Gabor Greifconst bar &B3 = B1; 7608993c03abed359171d12b50ab38da0ac331cfb7Gabor Greifconst bar *const B4 = B2; 77ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif 78af8e2ef649b90e88f9d595a638279e3bc4892845Gabor GreifTEST(CastingTest, isa) { 79ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif EXPECT_TRUE(isa<foo>(B1)); 80af8e2ef649b90e88f9d595a638279e3bc4892845Gabor Greif EXPECT_TRUE(isa<foo>(B2)); 81af8e2ef649b90e88f9d595a638279e3bc4892845Gabor Greif EXPECT_TRUE(isa<foo>(B3)); 82af8e2ef649b90e88f9d595a638279e3bc4892845Gabor Greif EXPECT_TRUE(isa<foo>(B4)); 83ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif} 84ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif 8508993c03abed359171d12b50ab38da0ac331cfb7Gabor GreifTEST(CastingTest, cast) { 8608993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif foo &F1 = cast<foo>(B1); 8708993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif EXPECT_NE(&F1, null_foo); 8808993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif const foo *F3 = cast<foo>(B2); 8908993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif EXPECT_NE(F3, null_foo); 9008993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif const foo *F4 = cast<foo>(B2); 9108993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif EXPECT_NE(F4, null_foo); 92e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif const foo &F5 = cast<foo>(B3); 93e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif EXPECT_NE(&F5, null_foo); 94e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif const foo *F6 = cast<foo>(B4); 95e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif EXPECT_NE(F6, null_foo); 96e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif foo *F7 = cast<foo>(fub()); 97e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif EXPECT_EQ(F7, null_foo); 98d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif foo *F8 = B1.baz(); 99d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif EXPECT_NE(F8, null_foo); 10008993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif} 10108993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif 10208993c03abed359171d12b50ab38da0ac331cfb7Gabor GreifTEST(CastingTest, cast_or_null) { 10308993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif const foo *F11 = cast_or_null<foo>(B2); 10408993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif EXPECT_NE(F11, null_foo); 10508993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif const foo *F12 = cast_or_null<foo>(B2); 10608993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif EXPECT_NE(F12, null_foo); 10708993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif const foo *F13 = cast_or_null<foo>(B4); 10808993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif EXPECT_NE(F13, null_foo); 10908993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif const foo *F14 = cast_or_null<foo>(fub()); // Shouldn't print. 11008993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif EXPECT_EQ(F14, null_foo); 111d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif foo *F15 = B1.caz(); 112d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif EXPECT_NE(F15, null_foo); 113d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif} 114d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif 115d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor GreifTEST(CastingTest, dyn_cast) { 11646a35015f5268bf72150eb1b1517337e245e38e5Gabor Greif const foo *F1 = dyn_cast<foo>(B2); 11746a35015f5268bf72150eb1b1517337e245e38e5Gabor Greif EXPECT_NE(F1, null_foo); 11846a35015f5268bf72150eb1b1517337e245e38e5Gabor Greif const foo *F2 = dyn_cast<foo>(B2); 11946a35015f5268bf72150eb1b1517337e245e38e5Gabor Greif EXPECT_NE(F2, null_foo); 12046a35015f5268bf72150eb1b1517337e245e38e5Gabor Greif const foo *F3 = dyn_cast<foo>(B4); 121d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif EXPECT_NE(F3, null_foo); 122f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif // foo *F4 = dyn_cast<foo>(fub()); // not permittible 123f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif // EXPECT_EQ(F4, null_foo); 124f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif foo *F5 = B1.daz(); 125f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif EXPECT_NE(F5, null_foo); 126f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif} 127f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif 128f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor GreifTEST(CastingTest, dyn_cast_or_null) { 129f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif const foo *F1 = dyn_cast_or_null<foo>(B2); 130f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif EXPECT_NE(F1, null_foo); 131f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif const foo *F2 = dyn_cast_or_null<foo>(B2); 132f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif EXPECT_NE(F2, null_foo); 133f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif const foo *F3 = dyn_cast_or_null<foo>(B4); 134f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif EXPECT_NE(F3, null_foo); 135f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif foo *F4 = dyn_cast_or_null<foo>(fub()); 13646a35015f5268bf72150eb1b1517337e245e38e5Gabor Greif EXPECT_EQ(F4, null_foo); 137f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif foo *F5 = B1.naz(); 138f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif EXPECT_NE(F5, null_foo); 13908993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif} 14008993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif 141e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif// These lines are errors... 142e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif//foo *F20 = cast<foo>(B2); // Yields const foo* 143e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif//foo &F21 = cast<foo>(B3); // Yields const foo& 144e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif//foo *F22 = cast<foo>(B4); // Yields const foo* 145e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif//foo &F23 = cast_or_null<foo>(B1); 146e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif//const foo &F24 = cast_or_null<foo>(B3); 147e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 148e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 149ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greifbar B; 150ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greifbar &B1 = B; 151ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greifconst bar *B2 = &B; 152ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif} // anonymous namespace 153e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 154e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greifbar *llvm::fub() { return 0; } 155