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