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" 1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/User.h" 12b3c90d96bd64c4b2b1b471b3c45bb119c526ca7bGabor Greif#include "llvm/Support/Debug.h" 13b3c90d96bd64c4b2b1b471b3c45bb119c526ca7bGabor Greif#include "llvm/Support/raw_ostream.h" 14ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif#include "gtest/gtest.h" 15ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif#include <cstdlib> 16ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif 17e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greifnamespace llvm { 1860f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindola// Used to test illegal cast. If a cast doesn't match any of the "real" ones, 1960f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindola// it will match this one. 2060f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindolastruct IllegalCast; 21cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinestemplate <typename T> IllegalCast *cast(...) { return nullptr; } 22e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 23e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif// set up two example classes 24e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif// with conversion facility 25e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif// 26e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greifstruct bar { 27e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif bar() {} 28d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif struct foo *baz(); 29d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif struct foo *caz(); 30f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif struct foo *daz(); 31f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif struct foo *naz(); 32e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greifprivate: 33e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif bar(const bar &); 34e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif}; 35e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greifstruct foo { 36e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif void ext() const; 37e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif /* static bool classof(const bar *X) { 38e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif cerr << "Classof: " << X << "\n"; 39e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif return true; 40e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif }*/ 41e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif}; 42e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 43f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greiftemplate <> struct isa_impl<foo, bar> { 44e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif static inline bool doit(const bar &Val) { 45e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif dbgs() << "Classof: " << &Val << "\n"; 46e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif return true; 47e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif } 48e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif}; 49e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 50d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greiffoo *bar::baz() { 51e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif return cast<foo>(this); 52d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif} 53d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif 54d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greiffoo *bar::caz() { 55d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif return cast_or_null<foo>(this); 56d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif} 57d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif 58f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greiffoo *bar::daz() { 59d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif return dyn_cast<foo>(this); 60f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif} 61f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif 62f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greiffoo *bar::naz() { 63f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif return dyn_cast_or_null<foo>(this); 64f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif} 65e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 66e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 67e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greifbar *fub(); 6860f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindola 6960f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindolatemplate <> struct simplify_type<foo> { 7060f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindola typedef int SimpleType; 7160f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindola static SimpleType getSimplifiedValue(foo &Val) { return 0; } 7260f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindola}; 7360f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindola 74e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif} // End llvm namespace 75e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 76ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greifusing namespace llvm; 77ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif 7860f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindola 7960f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindola// Test the peculiar behavior of Use in simplify_type. 8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstatic_assert(std::is_same<simplify_type<Use>::SimpleType, Value *>::value, 8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines "Use doesn't simplify correctly!"); 8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstatic_assert(std::is_same<simplify_type<Use *>::SimpleType, Value *>::value, 8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines "Use doesn't simplify correctly!"); 8460f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindola 8560f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindola// Test that a regular class behaves as expected. 8636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstatic_assert(std::is_same<simplify_type<foo>::SimpleType, int>::value, 8736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines "Unexpected simplify_type result!"); 8836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstatic_assert(std::is_same<simplify_type<foo *>::SimpleType, foo *>::value, 8936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines "Unexpected simplify_type result!"); 9060f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindola 91ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greifnamespace { 92ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif 93cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesconst foo *null_foo = nullptr; 9408993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif 952a53577728948052b8508760406b6ba68e55fc82NAKAMURA Takumibar B; 96ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greifextern bar &B1; 972a53577728948052b8508760406b6ba68e55fc82NAKAMURA Takumibar &B1 = B; 98ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greifextern const bar *B2; 9908993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif// test various configurations of const 10008993c03abed359171d12b50ab38da0ac331cfb7Gabor Greifconst bar &B3 = B1; 10108993c03abed359171d12b50ab38da0ac331cfb7Gabor Greifconst bar *const B4 = B2; 102ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif 103af8e2ef649b90e88f9d595a638279e3bc4892845Gabor GreifTEST(CastingTest, isa) { 104ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif EXPECT_TRUE(isa<foo>(B1)); 105af8e2ef649b90e88f9d595a638279e3bc4892845Gabor Greif EXPECT_TRUE(isa<foo>(B2)); 106af8e2ef649b90e88f9d595a638279e3bc4892845Gabor Greif EXPECT_TRUE(isa<foo>(B3)); 107af8e2ef649b90e88f9d595a638279e3bc4892845Gabor Greif EXPECT_TRUE(isa<foo>(B4)); 108ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif} 109ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif 11008993c03abed359171d12b50ab38da0ac331cfb7Gabor GreifTEST(CastingTest, cast) { 11108993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif foo &F1 = cast<foo>(B1); 11208993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif EXPECT_NE(&F1, null_foo); 11308993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif const foo *F3 = cast<foo>(B2); 11408993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif EXPECT_NE(F3, null_foo); 11508993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif const foo *F4 = cast<foo>(B2); 11608993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif EXPECT_NE(F4, null_foo); 117e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif const foo &F5 = cast<foo>(B3); 118e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif EXPECT_NE(&F5, null_foo); 119e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif const foo *F6 = cast<foo>(B4); 120e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif EXPECT_NE(F6, null_foo); 12179b59a2766c42180f08fd49c3ea1c5b66682d487Richard Smith // Can't pass null pointer to cast<>. 12279b59a2766c42180f08fd49c3ea1c5b66682d487Richard Smith // foo *F7 = cast<foo>(fub()); 12379b59a2766c42180f08fd49c3ea1c5b66682d487Richard Smith // EXPECT_EQ(F7, null_foo); 124d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif foo *F8 = B1.baz(); 125d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif EXPECT_NE(F8, null_foo); 12608993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif} 12708993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif 12808993c03abed359171d12b50ab38da0ac331cfb7Gabor GreifTEST(CastingTest, cast_or_null) { 12908993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif const foo *F11 = cast_or_null<foo>(B2); 13008993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif EXPECT_NE(F11, null_foo); 13108993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif const foo *F12 = cast_or_null<foo>(B2); 13208993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif EXPECT_NE(F12, null_foo); 13308993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif const foo *F13 = cast_or_null<foo>(B4); 13408993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif EXPECT_NE(F13, null_foo); 13508993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif const foo *F14 = cast_or_null<foo>(fub()); // Shouldn't print. 13608993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif EXPECT_EQ(F14, null_foo); 137d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif foo *F15 = B1.caz(); 138d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif EXPECT_NE(F15, null_foo); 139d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif} 140d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif 141d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor GreifTEST(CastingTest, dyn_cast) { 14246a35015f5268bf72150eb1b1517337e245e38e5Gabor Greif const foo *F1 = dyn_cast<foo>(B2); 14346a35015f5268bf72150eb1b1517337e245e38e5Gabor Greif EXPECT_NE(F1, null_foo); 14446a35015f5268bf72150eb1b1517337e245e38e5Gabor Greif const foo *F2 = dyn_cast<foo>(B2); 14546a35015f5268bf72150eb1b1517337e245e38e5Gabor Greif EXPECT_NE(F2, null_foo); 14646a35015f5268bf72150eb1b1517337e245e38e5Gabor Greif const foo *F3 = dyn_cast<foo>(B4); 147d159467ad66b21172d6d88a9f8e496c5b6c2ba4eGabor Greif EXPECT_NE(F3, null_foo); 14879b59a2766c42180f08fd49c3ea1c5b66682d487Richard Smith // Can't pass null pointer to dyn_cast<>. 14979b59a2766c42180f08fd49c3ea1c5b66682d487Richard Smith // foo *F4 = dyn_cast<foo>(fub()); 150f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif // EXPECT_EQ(F4, null_foo); 151f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif foo *F5 = B1.daz(); 152f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif EXPECT_NE(F5, null_foo); 153f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif} 154f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif 155f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor GreifTEST(CastingTest, dyn_cast_or_null) { 156f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif const foo *F1 = dyn_cast_or_null<foo>(B2); 157f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif EXPECT_NE(F1, null_foo); 158f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif const foo *F2 = dyn_cast_or_null<foo>(B2); 159f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif EXPECT_NE(F2, null_foo); 160f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif const foo *F3 = dyn_cast_or_null<foo>(B4); 161f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif EXPECT_NE(F3, null_foo); 162f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif foo *F4 = dyn_cast_or_null<foo>(fub()); 16346a35015f5268bf72150eb1b1517337e245e38e5Gabor Greif EXPECT_EQ(F4, null_foo); 164f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif foo *F5 = B1.naz(); 165f06eb3719aef56a31fb5c56e5b086995aefafef5Gabor Greif EXPECT_NE(F5, null_foo); 16608993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif} 16708993c03abed359171d12b50ab38da0ac331cfb7Gabor Greif 168e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif// These lines are errors... 169e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif//foo *F20 = cast<foo>(B2); // Yields const foo* 170e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif//foo &F21 = cast<foo>(B3); // Yields const foo& 171e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif//foo *F22 = cast<foo>(B4); // Yields const foo* 172e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif//foo &F23 = cast_or_null<foo>(B1); 173e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif//const foo &F24 = cast_or_null<foo>(B3); 174e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 175ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greifconst bar *B2 = &B; 176ee57dae3d8bcb2f3f41eb225bc615045d13d9ddaGabor Greif} // anonymous namespace 177e8950977a5cf929ab15b6c5f7265a029500d9a7dGabor Greif 178cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesbar *llvm::fub() { return nullptr; } 1798b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva 1808b8fa7b2f403ae2f342413239c4151e075022c97Sean Silvanamespace { 1818b8fa7b2f403ae2f342413239c4151e075022c97Sean Silvanamespace inferred_upcasting { 1828b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva// This test case verifies correct behavior of inferred upcasts when the 1838b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva// types are statically known to be OK to upcast. This is the case when, 1848b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva// for example, Derived inherits from Base, and we do `isa<Base>(Derived)`. 1858b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva 1868b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva// Note: This test will actually fail to compile without inferred 1878b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva// upcasting. 1888b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva 1898b8fa7b2f403ae2f342413239c4151e075022c97Sean Silvaclass Base { 1908b8fa7b2f403ae2f342413239c4151e075022c97Sean Silvapublic: 1918b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva // No classof. We are testing that the upcast is inferred. 1928b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva Base() {} 1938b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva}; 1948b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva 1958b8fa7b2f403ae2f342413239c4151e075022c97Sean Silvaclass Derived : public Base { 1968b8fa7b2f403ae2f342413239c4151e075022c97Sean Silvapublic: 1978b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva Derived() {} 1988b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva}; 1998b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva 2008b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva// Even with no explicit classof() in Base, we should still be able to cast 2018b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva// Derived to its base class. 2028b8fa7b2f403ae2f342413239c4151e075022c97Sean SilvaTEST(CastingTest, UpcastIsInferred) { 2038b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva Derived D; 2048b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva EXPECT_TRUE(isa<Base>(D)); 2058b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva Base *BP = dyn_cast<Base>(&D); 206cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines EXPECT_TRUE(BP != nullptr); 2078b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva} 2088b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva 2098b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva 2108b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva// This test verifies that the inferred upcast takes precedence over an 2118b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva// explicitly written one. This is important because it verifies that the 2128b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva// dynamic check gets optimized away. 2138b8fa7b2f403ae2f342413239c4151e075022c97Sean Silvaclass UseInferredUpcast { 2148b8fa7b2f403ae2f342413239c4151e075022c97Sean Silvapublic: 2158b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva int Dummy; 2168b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva static bool classof(const UseInferredUpcast *) { 2178b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva return false; 2188b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva } 2198b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva}; 2208b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva 2218b8fa7b2f403ae2f342413239c4151e075022c97Sean SilvaTEST(CastingTest, InferredUpcastTakesPrecedence) { 2228b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva UseInferredUpcast UIU; 2238b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva // Since the explicit classof() returns false, this will fail if the 2248b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva // explicit one is used. 2258b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva EXPECT_TRUE(isa<UseInferredUpcast>(&UIU)); 2268b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva} 2278b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva 2288b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva} // end namespace inferred_upcasting 2298b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva} // end anonymous namespace 23060f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindola// Test that we reject casts of temporaries (and so the illegal cast gets used). 23160f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindolanamespace TemporaryCast { 23260f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindolastruct pod {}; 23360f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael EspindolaIllegalCast *testIllegalCast() { return cast<foo>(pod()); } 23460f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindola} 235