git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@92285 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Anders Carlsson 2009-12-30 01:25:42 +00:00
Родитель f64531a170
Коммит 2c0769e3e4
1 изменённых файлов: 38 добавлений и 1 удалений

Просмотреть файл

@ -6,12 +6,14 @@ extern "C" {
const void *_ZTVN10__cxxabiv123__fundamental_type_infoE;
const void *_ZTVN10__cxxabiv117__class_type_infoE;
const void *_ZTVN10__cxxabiv120__si_class_type_infoE;
const void *_ZTVN10__cxxabiv121__vmi_class_type_infoE;
const void *_ZTVN10__cxxabiv119__pointer_type_infoE;
const void *_ZTVN10__cxxabiv129__pointer_to_member_type_infoE;
};
#define fundamental_type_info_vtable _ZTVN10__cxxabiv123__fundamental_type_infoE
#define class_type_info_vtable _ZTVN10__cxxabiv117__class_type_infoE
#define si_class_type_info_vtable _ZTVN10__cxxabiv120__si_class_type_infoE
#define vmi_class_type_info_vtable _ZTVN10__cxxabiv121__vmi_class_type_infoE
#define pointer_type_info_vtable _ZTVN10__cxxabiv119__pointer_type_infoE
#define pointer_to_member_type_info_vtable _ZTVN10__cxxabiv129__pointer_to_member_type_infoE
@ -34,7 +36,17 @@ return static_cast<const T&>(info);
}
struct Incomplete;
struct A { };
struct A { int a; };
struct Empty { };
struct SI1 : A { };
struct SI2 : Empty { };
struct SI3 : Empty { virtual void f() { } };
struct VMI1 : private A { };
struct VMI2 : virtual A { };
struct VMI3 : A { virtual void f() { } };
struct VMI4 : A, Empty { };
#define CHECK(x) if (!(x)) return __LINE__
#define CHECK_VTABLE(type, vtable) if (&vtable##_type_info_vtable + 2 != (((void **)&(typeid(type)))[0])) return __LINE__
@ -44,6 +56,31 @@ int f() {
// Vectors should be treated as fundamental types.
typedef short __v4hi __attribute__ ((__vector_size__ (8)));
CHECK_VTABLE(__v4hi, fundamental);
// A does not have any bases.
CHECK_VTABLE(A, class);
// SI1 has a single public base.
CHECK_VTABLE(SI1, si_class);
// SI2 has a single public empty base.
CHECK_VTABLE(SI2, si_class);
// SI3 has a single public empty base. SI3 is dynamic whereas Empty is not, but since Empty is
// an empty class, it will still be at offset zero.
CHECK_VTABLE(SI3, si_class);
// VMI1 has a single base, but it is private.
CHECK_VTABLE(VMI1, vmi_class);
// VMI2 has a single base, but it is virtual.
CHECK_VTABLE(VMI2, vmi_class);
// VMI3 has a single base, but VMI3 is dynamic whereas A is not, and A is not empty.
CHECK_VTABLE(VMI3, vmi_class);
// VMI4 has two bases.
CHECK_VTABLE(VMI4, vmi_class);
// Pointers to incomplete classes.
CHECK_VTABLE(Incomplete *, pointer);