1e8820a888a5d19d2c687c222cc1d5e415aedd2a7Anders Carlsson// RUN: %clang_cc1 %s -I%S -triple=x86_64-apple-darwin10 -emit-llvm -O3 -o - | FileCheck %s 20a4f18696ccda75a00012b941430414954e678b9Anders Carlsson#include <typeinfo> 30a4f18696ccda75a00012b941430414954e678b9Anders Carlsson 4f64531a17037faa9e0119e90961d2db77d06865dAnders Carlsson// vtables. 5f64531a17037faa9e0119e90961d2db77d06865dAnders Carlssonextern "C" { 6f64531a17037faa9e0119e90961d2db77d06865dAnders Carlsson const void *_ZTVN10__cxxabiv123__fundamental_type_infoE; 7f64531a17037faa9e0119e90961d2db77d06865dAnders Carlsson const void *_ZTVN10__cxxabiv117__class_type_infoE; 8f64531a17037faa9e0119e90961d2db77d06865dAnders Carlsson const void *_ZTVN10__cxxabiv120__si_class_type_infoE; 92c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlsson const void *_ZTVN10__cxxabiv121__vmi_class_type_infoE; 10f64531a17037faa9e0119e90961d2db77d06865dAnders Carlsson const void *_ZTVN10__cxxabiv119__pointer_type_infoE; 11f64531a17037faa9e0119e90961d2db77d06865dAnders Carlsson const void *_ZTVN10__cxxabiv129__pointer_to_member_type_infoE; 12f64531a17037faa9e0119e90961d2db77d06865dAnders Carlsson}; 13f64531a17037faa9e0119e90961d2db77d06865dAnders Carlsson#define fundamental_type_info_vtable _ZTVN10__cxxabiv123__fundamental_type_infoE 14f64531a17037faa9e0119e90961d2db77d06865dAnders Carlsson#define class_type_info_vtable _ZTVN10__cxxabiv117__class_type_infoE 15f64531a17037faa9e0119e90961d2db77d06865dAnders Carlsson#define si_class_type_info_vtable _ZTVN10__cxxabiv120__si_class_type_infoE 162c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlsson#define vmi_class_type_info_vtable _ZTVN10__cxxabiv121__vmi_class_type_infoE 17f64531a17037faa9e0119e90961d2db77d06865dAnders Carlsson#define pointer_type_info_vtable _ZTVN10__cxxabiv119__pointer_type_infoE 18f64531a17037faa9e0119e90961d2db77d06865dAnders Carlsson#define pointer_to_member_type_info_vtable _ZTVN10__cxxabiv129__pointer_to_member_type_infoE 19f64531a17037faa9e0119e90961d2db77d06865dAnders Carlsson 200a4f18696ccda75a00012b941430414954e678b9Anders Carlssonclass __pbase_type_info : public std::type_info { 210a4f18696ccda75a00012b941430414954e678b9Anders Carlssonpublic: 220a4f18696ccda75a00012b941430414954e678b9Anders Carlsson unsigned int __flags; 230a4f18696ccda75a00012b941430414954e678b9Anders Carlsson const std::type_info *__pointee; 240a4f18696ccda75a00012b941430414954e678b9Anders Carlsson 250a4f18696ccda75a00012b941430414954e678b9Anders Carlsson enum __masks { 260a4f18696ccda75a00012b941430414954e678b9Anders Carlsson __const_mask = 0x1, 270a4f18696ccda75a00012b941430414954e678b9Anders Carlsson __volatile_mask = 0x2, 280a4f18696ccda75a00012b941430414954e678b9Anders Carlsson __restrict_mask = 0x4, 290a4f18696ccda75a00012b941430414954e678b9Anders Carlsson __incomplete_mask = 0x8, 300a4f18696ccda75a00012b941430414954e678b9Anders Carlsson __incomplete_class_mask = 0x10 310a4f18696ccda75a00012b941430414954e678b9Anders Carlsson }; 320a4f18696ccda75a00012b941430414954e678b9Anders Carlsson}; 330a4f18696ccda75a00012b941430414954e678b9Anders Carlsson 34beb80194298097ef8680136d28e96a9326df90acAnders Carlssonclass __class_type_info : public std::type_info { }; 35beb80194298097ef8680136d28e96a9326df90acAnders Carlsson 36beb80194298097ef8680136d28e96a9326df90acAnders Carlssonclass __si_class_type_info : public __class_type_info { 37beb80194298097ef8680136d28e96a9326df90acAnders Carlssonpublic: 38beb80194298097ef8680136d28e96a9326df90acAnders Carlsson const __class_type_info *__base_type; 39beb80194298097ef8680136d28e96a9326df90acAnders Carlsson}; 40beb80194298097ef8680136d28e96a9326df90acAnders Carlsson 410814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlssonstruct __base_class_type_info { 420814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlssonpublic: 430814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson const __class_type_info *__base_type; 440814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson long __offset_flags; 450814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson 460814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson enum __offset_flags_masks { 470814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson __virtual_mask = 0x1, 480814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson __public_mask = 0x2, 490814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson __offset_shift = 8 500814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson }; 510814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson}; 520814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson 530814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlssonclass __vmi_class_type_info : public __class_type_info { 540814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlssonpublic: 550814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson unsigned int __flags; 560814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson unsigned int __base_count; 570814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson __base_class_type_info __base_info[1]; 580814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson 590814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson enum __flags_masks { 600814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson __non_diamond_repeat_mask = 0x1, 610814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson __diamond_shaped_mask = 0x2 620814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson }; 630814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson}; 640814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson 650a4f18696ccda75a00012b941430414954e678b9Anders Carlssontemplate<typename T> const T& to(const std::type_info &info) { 660a4f18696ccda75a00012b941430414954e678b9Anders Carlssonreturn static_cast<const T&>(info); 670a4f18696ccda75a00012b941430414954e678b9Anders Carlsson} 680a4f18696ccda75a00012b941430414954e678b9Anders Carlssonstruct Incomplete; 690a4f18696ccda75a00012b941430414954e678b9Anders Carlsson 702c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlssonstruct A { int a; }; 712c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlssonstruct Empty { }; 722c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlsson 732c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlssonstruct SI1 : A { }; 742c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlssonstruct SI2 : Empty { }; 752c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlssonstruct SI3 : Empty { virtual void f() { } }; 762c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlsson 772c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlssonstruct VMI1 : private A { }; 782c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlssonstruct VMI2 : virtual A { }; 792c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlssonstruct VMI3 : A { virtual void f() { } }; 802c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlssonstruct VMI4 : A, Empty { }; 8117fa6f971c1912c77aa10bdac4b7991b5e1646e2Anders Carlsson 820814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlssonstruct VMIBase1 { int a; }; 830814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlssonstruct VMIBase2 : VMIBase1 { int a; }; 840814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlssonstruct VMI5 : VMIBase1, VMIBase2 { int a; }; 850814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson 860814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlssonstruct VMIBase3 : virtual VMIBase1 { int a; }; 870814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlssonstruct VMI6 : virtual VMIBase1, VMIBase3 { int a; }; 880814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson 890814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlssonstruct VMI7 : VMIBase1, VMI5, private VMI6 { }; 900814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson 91f64531a17037faa9e0119e90961d2db77d06865dAnders Carlsson#define CHECK(x) if (!(x)) return __LINE__ 920814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson#define CHECK_VTABLE(type, vtable) CHECK(&vtable##_type_info_vtable + 2 == (((void **)&(typeid(type)))[0])) 930814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson#define CHECK_BASE_INFO_TYPE(type, index, base) CHECK(to<__vmi_class_type_info>(typeid(type)).__base_info[(index)].__base_type == &typeid(base)) 940814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson#define CHECK_BASE_INFO_OFFSET_FLAGS(type, index, offset, flags) CHECK(to<__vmi_class_type_info>(typeid(type)).__base_info[(index)].__offset_flags == (((offset) << 8) | (flags))) 958d1451535524cb21a6f8347bad9fed371b9d9ecbAnders Carlsson 96abd6b09e3daa4d82b7e8ee6966d7f745fd121835Anders Carlssonstruct B { 97abd6b09e3daa4d82b7e8ee6966d7f745fd121835Anders Carlsson static int const volatile (*a)[10]; 98abd6b09e3daa4d82b7e8ee6966d7f745fd121835Anders Carlsson static int (*b)[10]; 99abd6b09e3daa4d82b7e8ee6966d7f745fd121835Anders Carlsson 100abd6b09e3daa4d82b7e8ee6966d7f745fd121835Anders Carlsson static int const volatile (B::*c)[10]; 101abd6b09e3daa4d82b7e8ee6966d7f745fd121835Anders Carlsson static int (B::*d)[10]; 102abd6b09e3daa4d82b7e8ee6966d7f745fd121835Anders Carlsson}; 103abd6b09e3daa4d82b7e8ee6966d7f745fd121835Anders Carlsson 10493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define i32 @_Z1fv() 1050a4f18696ccda75a00012b941430414954e678b9Anders Carlssonint f() { 106f64531a17037faa9e0119e90961d2db77d06865dAnders Carlsson // Vectors should be treated as fundamental types. 107f64531a17037faa9e0119e90961d2db77d06865dAnders Carlsson typedef short __v4hi __attribute__ ((__vector_size__ (8))); 108f64531a17037faa9e0119e90961d2db77d06865dAnders Carlsson CHECK_VTABLE(__v4hi, fundamental); 1092c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlsson 1102c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlsson // A does not have any bases. 1112c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlsson CHECK_VTABLE(A, class); 1122c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlsson 1132c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlsson // SI1 has a single public base. 1142c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlsson CHECK_VTABLE(SI1, si_class); 1150814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson CHECK(to<__si_class_type_info>(typeid(SI1)).__base_type == &typeid(A)); 1162c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlsson 1172c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlsson // SI2 has a single public empty base. 1182c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlsson CHECK_VTABLE(SI2, si_class); 1190814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson CHECK(to<__si_class_type_info>(typeid(SI2)).__base_type == &typeid(Empty)); 1202c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlsson 1212c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlsson // SI3 has a single public empty base. SI3 is dynamic whereas Empty is not, but since Empty is 1222c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlsson // an empty class, it will still be at offset zero. 1232c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlsson CHECK_VTABLE(SI3, si_class); 1240814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson CHECK(to<__si_class_type_info>(typeid(SI3)).__base_type == &typeid(Empty)); 1252c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlsson 1262c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlsson // VMI1 has a single base, but it is private. 1272c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlsson CHECK_VTABLE(VMI1, vmi_class); 1282c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlsson 1292c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlsson // VMI2 has a single base, but it is virtual. 1302c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlsson CHECK_VTABLE(VMI2, vmi_class); 1312c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlsson 1322c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlsson // VMI3 has a single base, but VMI3 is dynamic whereas A is not, and A is not empty. 1332c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlsson CHECK_VTABLE(VMI3, vmi_class); 1342c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlsson 1352c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlsson // VMI4 has two bases. 1362c0769e3e4ba4ad375421f0a6c6b110ed19a6dfeAnders Carlsson CHECK_VTABLE(VMI4, vmi_class); 1370814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson 1380814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson // VMI5 has non-diamond shaped inheritance. 1390814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson CHECK_VTABLE(VMI5, vmi_class); 1400814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson CHECK(to<__vmi_class_type_info>(typeid(VMI5)).__flags == __vmi_class_type_info::__non_diamond_repeat_mask); 1410814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson CHECK(to<__vmi_class_type_info>(typeid(VMI5)).__base_count == 2); 1420814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson CHECK_BASE_INFO_TYPE(VMI5, 0, VMIBase1); 1430814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson CHECK_BASE_INFO_OFFSET_FLAGS(VMI5, 0, 0, __base_class_type_info::__public_mask); 1440814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson CHECK_BASE_INFO_TYPE(VMI5, 1, VMIBase2); 1450814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson CHECK_BASE_INFO_OFFSET_FLAGS(VMI5, 1, 4, __base_class_type_info::__public_mask); 146f64531a17037faa9e0119e90961d2db77d06865dAnders Carlsson 1470814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson // VMI6 has diamond shaped inheritance. 1480814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson CHECK_VTABLE(VMI6, vmi_class); 1490814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson CHECK(to<__vmi_class_type_info>(typeid(VMI6)).__flags == __vmi_class_type_info::__diamond_shaped_mask); 1500814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson CHECK(to<__vmi_class_type_info>(typeid(VMI6)).__base_count == 2); 1510814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson CHECK_BASE_INFO_TYPE(VMI6, 0, VMIBase1); 1520814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson CHECK_BASE_INFO_OFFSET_FLAGS(VMI6, 0, -24, __base_class_type_info::__public_mask | __base_class_type_info::__virtual_mask); 1530814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson CHECK_BASE_INFO_TYPE(VMI6, 1, VMIBase3); 1540814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson CHECK_BASE_INFO_OFFSET_FLAGS(VMI6, 1, 0, __base_class_type_info::__public_mask); 1550814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson 1560814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson // VMI7 has both non-diamond and diamond shaped inheritance. 1570814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson CHECK_VTABLE(VMI7, vmi_class); 1580814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson CHECK(to<__vmi_class_type_info>(typeid(VMI7)).__flags == (__vmi_class_type_info::__non_diamond_repeat_mask | __vmi_class_type_info::__diamond_shaped_mask)); 1590814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson CHECK(to<__vmi_class_type_info>(typeid(VMI7)).__base_count == 3); 1600814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson CHECK_BASE_INFO_TYPE(VMI7, 0, VMIBase1); 1610814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson CHECK_BASE_INFO_OFFSET_FLAGS(VMI7, 0, 16, __base_class_type_info::__public_mask); 1620814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson CHECK_BASE_INFO_TYPE(VMI7, 1, VMI5); 1630814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson CHECK_BASE_INFO_OFFSET_FLAGS(VMI7, 1, 20, __base_class_type_info::__public_mask); 1640814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson CHECK_BASE_INFO_TYPE(VMI7, 2, VMI6); 1650814809e5bc27cccd59b63e99ab1eb52042dc13cAnders Carlsson CHECK_BASE_INFO_OFFSET_FLAGS(VMI7, 2, 0, 0); 166beb80194298097ef8680136d28e96a9326df90acAnders Carlsson 1678d1451535524cb21a6f8347bad9fed371b9d9ecbAnders Carlsson // Pointers to incomplete classes. 168f64531a17037faa9e0119e90961d2db77d06865dAnders Carlsson CHECK_VTABLE(Incomplete *, pointer); 16917fa6f971c1912c77aa10bdac4b7991b5e1646e2Anders Carlsson CHECK(to<__pbase_type_info>(typeid(Incomplete *)).__flags == __pbase_type_info::__incomplete_mask); 17017fa6f971c1912c77aa10bdac4b7991b5e1646e2Anders Carlsson CHECK(to<__pbase_type_info>(typeid(Incomplete **)).__flags == __pbase_type_info::__incomplete_mask); 17117fa6f971c1912c77aa10bdac4b7991b5e1646e2Anders Carlsson CHECK(to<__pbase_type_info>(typeid(Incomplete ***)).__flags == __pbase_type_info::__incomplete_mask); 1728d1451535524cb21a6f8347bad9fed371b9d9ecbAnders Carlsson 1738d1451535524cb21a6f8347bad9fed371b9d9ecbAnders Carlsson // Member pointers. 174f64531a17037faa9e0119e90961d2db77d06865dAnders Carlsson CHECK_VTABLE(int Incomplete::*, pointer_to_member); 17517fa6f971c1912c77aa10bdac4b7991b5e1646e2Anders Carlsson CHECK(to<__pbase_type_info>(typeid(int Incomplete::*)).__flags == __pbase_type_info::__incomplete_class_mask); 17617fa6f971c1912c77aa10bdac4b7991b5e1646e2Anders Carlsson CHECK(to<__pbase_type_info>(typeid(Incomplete Incomplete::*)).__flags == (__pbase_type_info::__incomplete_class_mask | __pbase_type_info::__incomplete_mask)); 17717fa6f971c1912c77aa10bdac4b7991b5e1646e2Anders Carlsson CHECK(to<__pbase_type_info>(typeid(Incomplete A::*)).__flags == (__pbase_type_info::__incomplete_mask)); 1788d1451535524cb21a6f8347bad9fed371b9d9ecbAnders Carlsson 179abd6b09e3daa4d82b7e8ee6966d7f745fd121835Anders Carlsson // Check that when stripping qualifiers off the pointee type, we correctly handle arrays. 180abd6b09e3daa4d82b7e8ee6966d7f745fd121835Anders Carlsson CHECK(to<__pbase_type_info>(typeid(B::a)).__flags == (__pbase_type_info::__const_mask | __pbase_type_info::__volatile_mask)); 181abd6b09e3daa4d82b7e8ee6966d7f745fd121835Anders Carlsson CHECK(to<__pbase_type_info>(typeid(B::a)).__pointee == to<__pbase_type_info>(typeid(B::b)).__pointee); 182abd6b09e3daa4d82b7e8ee6966d7f745fd121835Anders Carlsson CHECK(to<__pbase_type_info>(typeid(B::c)).__flags == (__pbase_type_info::__const_mask | __pbase_type_info::__volatile_mask)); 183abd6b09e3daa4d82b7e8ee6966d7f745fd121835Anders Carlsson CHECK(to<__pbase_type_info>(typeid(B::c)).__pointee == to<__pbase_type_info>(typeid(B::d)).__pointee); 184abd6b09e3daa4d82b7e8ee6966d7f745fd121835Anders Carlsson 1850a4f18696ccda75a00012b941430414954e678b9Anders Carlsson // Success! 1868d1451535524cb21a6f8347bad9fed371b9d9ecbAnders Carlsson // CHECK: ret i32 0 1870a4f18696ccda75a00012b941430414954e678b9Anders Carlsson return 0; 1880a4f18696ccda75a00012b941430414954e678b9Anders Carlsson} 1890a4f18696ccda75a00012b941430414954e678b9Anders Carlsson 1900a4f18696ccda75a00012b941430414954e678b9Anders Carlsson#ifdef HARNESS 1910a4f18696ccda75a00012b941430414954e678b9Anders Carlssonextern "C" void printf(const char *, ...); 1920a4f18696ccda75a00012b941430414954e678b9Anders Carlsson 1930a4f18696ccda75a00012b941430414954e678b9Anders Carlssonint main() { 1940a4f18696ccda75a00012b941430414954e678b9Anders Carlsson int result = f(); 1950a4f18696ccda75a00012b941430414954e678b9Anders Carlsson 1960a4f18696ccda75a00012b941430414954e678b9Anders Carlsson if (result == 0) 1970a4f18696ccda75a00012b941430414954e678b9Anders Carlsson printf("success!\n"); 1980a4f18696ccda75a00012b941430414954e678b9Anders Carlsson else 1998d1451535524cb21a6f8347bad9fed371b9d9ecbAnders Carlsson printf("test on line %d failed!\n", result); 2000a4f18696ccda75a00012b941430414954e678b9Anders Carlsson 2010a4f18696ccda75a00012b941430414954e678b9Anders Carlsson return result; 2020a4f18696ccda75a00012b941430414954e678b9Anders Carlsson} 2030a4f18696ccda75a00012b941430414954e678b9Anders Carlsson#endif 2040a4f18696ccda75a00012b941430414954e678b9Anders Carlsson 2050a4f18696ccda75a00012b941430414954e678b9Anders Carlsson 206