Casting.cpp revision 8b8fa7b2f403ae2f342413239c4151e075022c97
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 722a53577728948052b8508760406b6ba68e55fc82NAKAMURA Takumibar B; 73ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greifextern bar &B1; 742a53577728948052b8508760406b6ba68e55fc82NAKAMURA Takumibar &B1 = B; 75ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greifextern const bar *B2; 7608993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif// test various configurations of const 7708993c03abed359171d12b50ab38da0ac331cfb7Gabor Greifconst bar &B3 = B1; 7808993c03abed359171d12b50ab38da0ac331cfb7Gabor Greifconst bar *const B4 = B2; 79ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif 80af8e2ef649b90e88f9d595a638279e3bc4892845Gabor GreifTEST(CastingTest, isa) { 81ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif EXPECT_TRUE(isa<foo>(B1)); 82af8e2ef649b90e88f9d595a638279e3bc4892845Gabor Greif EXPECT_TRUE(isa<foo>(B2)); 83af8e2ef649b90e88f9d595a638279e3bc4892845Gabor Greif EXPECT_TRUE(isa<foo>(B3)); 84af8e2ef649b90e88f9d595a638279e3bc4892845Gabor Greif EXPECT_TRUE(isa<foo>(B4)); 85ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif} 86ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif 8708993c03abed359171d12b50ab38da0ac331cfb7Gabor GreifTEST(CastingTest, cast) { 8808993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif foo &F1 = cast<foo>(B1); 8908993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif EXPECT_NE(&F1, null_foo); 9008993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif const foo *F3 = cast<foo>(B2); 9108993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif EXPECT_NE(F3, null_foo); 9208993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif const foo *F4 = cast<foo>(B2); 9308993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif EXPECT_NE(F4, null_foo); 94e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif const foo &F5 = cast<foo>(B3); 95e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif EXPECT_NE(&F5, null_foo); 96e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif const foo *F6 = cast<foo>(B4); 97e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif EXPECT_NE(F6, null_foo); 9879b59a2766c42180f08fd49c3ea1c5b66682d487Richard Smith // Can't pass null pointer to cast<>. 9979b59a2766c42180f08fd49c3ea1c5b66682d487Richard Smith // foo *F7 = cast<foo>(fub()); 10079b59a2766c42180f08fd49c3ea1c5b66682d487Richard Smith // EXPECT_EQ(F7, null_foo); 101d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif foo *F8 = B1.baz(); 102d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif EXPECT_NE(F8, null_foo); 10308993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif} 10408993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif 10508993c03abed359171d12b50ab38da0ac331cfb7Gabor GreifTEST(CastingTest, cast_or_null) { 10608993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif const foo *F11 = cast_or_null<foo>(B2); 10708993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif EXPECT_NE(F11, null_foo); 10808993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif const foo *F12 = cast_or_null<foo>(B2); 10908993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif EXPECT_NE(F12, null_foo); 11008993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif const foo *F13 = cast_or_null<foo>(B4); 11108993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif EXPECT_NE(F13, null_foo); 11208993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif const foo *F14 = cast_or_null<foo>(fub()); // Shouldn't print. 11308993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif EXPECT_EQ(F14, null_foo); 114d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif foo *F15 = B1.caz(); 115d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif EXPECT_NE(F15, null_foo); 116d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif} 117d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif 118d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor GreifTEST(CastingTest, dyn_cast) { 11946a35015f5268bf72150eb1b1517337e245e38e5Gabor Greif const foo *F1 = dyn_cast<foo>(B2); 12046a35015f5268bf72150eb1b1517337e245e38e5Gabor Greif EXPECT_NE(F1, null_foo); 12146a35015f5268bf72150eb1b1517337e245e38e5Gabor Greif const foo *F2 = dyn_cast<foo>(B2); 12246a35015f5268bf72150eb1b1517337e245e38e5Gabor Greif EXPECT_NE(F2, null_foo); 12346a35015f5268bf72150eb1b1517337e245e38e5Gabor Greif const foo *F3 = dyn_cast<foo>(B4); 124d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif EXPECT_NE(F3, null_foo); 12579b59a2766c42180f08fd49c3ea1c5b66682d487Richard Smith // Can't pass null pointer to dyn_cast<>. 12679b59a2766c42180f08fd49c3ea1c5b66682d487Richard Smith // foo *F4 = dyn_cast<foo>(fub()); 127f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif // EXPECT_EQ(F4, null_foo); 128f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif foo *F5 = B1.daz(); 129f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif EXPECT_NE(F5, null_foo); 130f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif} 131f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif 132f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor GreifTEST(CastingTest, dyn_cast_or_null) { 133f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif const foo *F1 = dyn_cast_or_null<foo>(B2); 134f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif EXPECT_NE(F1, null_foo); 135f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif const foo *F2 = dyn_cast_or_null<foo>(B2); 136f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif EXPECT_NE(F2, null_foo); 137f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif const foo *F3 = dyn_cast_or_null<foo>(B4); 138f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif EXPECT_NE(F3, null_foo); 139f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif foo *F4 = dyn_cast_or_null<foo>(fub()); 14046a35015f5268bf72150eb1b1517337e245e38e5Gabor Greif EXPECT_EQ(F4, null_foo); 141f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif foo *F5 = B1.naz(); 142f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif EXPECT_NE(F5, null_foo); 14308993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif} 14408993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif 145e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif// These lines are errors... 146e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif//foo *F20 = cast<foo>(B2); // Yields const foo* 147e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif//foo &F21 = cast<foo>(B3); // Yields const foo& 148e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif//foo *F22 = cast<foo>(B4); // Yields const foo* 149e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif//foo &F23 = cast_or_null<foo>(B1); 150e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif//const foo &F24 = cast_or_null<foo>(B3); 151e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 152ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greifconst bar *B2 = &B; 153ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif} // anonymous namespace 154e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 155e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greifbar *llvm::fub() { return 0; } 1568b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva 1578b8fa7b2f403ae2f342413239c4151e075022c97Sean Silvanamespace { 1588b8fa7b2f403ae2f342413239c4151e075022c97Sean Silvanamespace inferred_upcasting { 1598b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva// This test case verifies correct behavior of inferred upcasts when the 1608b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva// types are statically known to be OK to upcast. This is the case when, 1618b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva// for example, Derived inherits from Base, and we do `isa<Base>(Derived)`. 1628b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva 1638b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva// Note: This test will actually fail to compile without inferred 1648b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva// upcasting. 1658b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva 1668b8fa7b2f403ae2f342413239c4151e075022c97Sean Silvaclass Base { 1678b8fa7b2f403ae2f342413239c4151e075022c97Sean Silvapublic: 1688b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva // No classof. We are testing that the upcast is inferred. 1698b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva Base() {} 1708b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva}; 1718b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva 1728b8fa7b2f403ae2f342413239c4151e075022c97Sean Silvaclass Derived : public Base { 1738b8fa7b2f403ae2f342413239c4151e075022c97Sean Silvapublic: 1748b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva Derived() {} 1758b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva}; 1768b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva 1778b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva// Even with no explicit classof() in Base, we should still be able to cast 1788b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva// Derived to its base class. 1798b8fa7b2f403ae2f342413239c4151e075022c97Sean SilvaTEST(CastingTest, UpcastIsInferred) { 1808b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva Derived D; 1818b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva EXPECT_TRUE(isa<Base>(D)); 1828b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva Base *BP = dyn_cast<Base>(&D); 1838b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva EXPECT_TRUE(BP != NULL); 1848b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva} 1858b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva 1868b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva 1878b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva// This test verifies that the inferred upcast takes precedence over an 1888b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva// explicitly written one. This is important because it verifies that the 1898b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva// dynamic check gets optimized away. 1908b8fa7b2f403ae2f342413239c4151e075022c97Sean Silvaclass UseInferredUpcast { 1918b8fa7b2f403ae2f342413239c4151e075022c97Sean Silvapublic: 1928b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva int Dummy; 1938b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva static bool classof(const UseInferredUpcast *) { 1948b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva return false; 1958b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva } 1968b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva}; 1978b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva 1988b8fa7b2f403ae2f342413239c4151e075022c97Sean SilvaTEST(CastingTest, InferredUpcastTakesPrecedence) { 1998b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva UseInferredUpcast UIU; 2008b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva // Since the explicit classof() returns false, this will fail if the 2018b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva // explicit one is used. 2028b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva EXPECT_TRUE(isa<UseInferredUpcast>(&UIU)); 2038b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva} 2048b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva 2058b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva} // end namespace inferred_upcasting 2068b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva} // end anonymous namespace 207